| import numpy as np | |
| def F_measure(cm): | |
| idx = 0 | |
| rs, ps, fs = [], [], [] | |
| n_class = cm.shape[0] | |
| for idx in range(n_class): | |
| TP = cm[idx][idx] | |
| r = TP / cm[idx].sum() if cm[idx].sum() != 0 else 0 | |
| p = TP / cm[:, idx].sum() if cm[:, idx].sum() != 0 else 0 | |
| f = 2 * r * p / (r + p) if (r + p) != 0 else 0 | |
| rs.append(r * 100) | |
| ps.append(p * 100) | |
| fs.append(f * 100) | |
| f = np.mean(fs).round(4) | |
| f_seen = np.mean(fs[:-1]).round(4) | |
| f_unseen = round(fs[-1], 4) | |
| results = {} | |
| results['F1-known'] = f_seen | |
| results['F1-open'] = f_unseen | |
| results['F1'] = f | |
| return results |