def run_single_nmf_experiment(mat, n_components, apply_nan, labels): if apply_nan: nmf = NMF.NMF(n_components=n_components, apply_nan_mask=True, nan_weight=0.1) else: nmf = NMF.NMF(n_components=n_components) W, H = nmf.decompose(mat) clusters = W.argmax(axis=1) nmi, nmi_t, nmi_p = calc_score_significance(labels, clusters, normalized_mutual_info_score) if nmi_p >= 0.05: print('non conclusive NMI with {} and nan_mask={} '.format(n_components, apply_nan), nmi_t, nmi_p) sill = silhouette_score(mat.toarray(), clusters) accs = [] f1s = [] for i in range(20): f1, f1_t, f1_p, acc, acc_t, acc_p = semi_supervised_classify(labels, clusters) accs.append(acc) f1s.append(f1) if f1_p >= 0.05: print('non conclusive f1 score with {} and nan_mask={} '.format(n_components, apply_nan), f1_t, f1_p) if acc_p >= 0.05: print('non conclusive accuracy score with {} and nan_mask={} '.format(n_components, apply_nan), acc_t, acc_p) return {'nmi': nmi, 'nmi_p': nmi_p, 'sill': sill, 'acc': np.mean(accs), 'acc_std': np.std(accs), 'f1': np.mean(f1s), 'f1_std': np.std(f1s)}