我已经在同一数据集上收集了几个聚类算法的输出,基于此我想生成一个邻接矩阵,表明任意两个样本聚集在一起的运行次数。即对于每个I = 10
群集,我有一个单热表示N x C_i
,表示样本n
是否属于群集c
(对于第i次运行),每次运行可能有不同(数量)的集群。然后,我们的目标是构建一个邻接矩阵N x N
,我可以在该矩阵上设置阈值并仅选择一致的集群进行进一步分析。
构建执行此操作的算法非常容易:
n_samples = runs[0].shape[0]
i = []
j = []
for iter_no, ca in enumerate(runs):
print("Processing adjacency", iter_no)
for col in range(ca.shape[1]):
comb = itertools.combinations(np.where(ca[:, col])[0], 2)
for c in comb:
i.append(c[0])
j.append(c[1])
i = np.array(i)
j = np.array(j)
adj_mat = scipy.sparse.coo_matrix((np.ones(len(i)), (i, j)), shape=[n_samples, n_samples])
这会使群集大小非常差,我通常会N = 15000
,群集大小偶尔会达到12k。因此,我正在寻找networkx
库可能加快速度吗?有没有明显的方法可以做到这一点?
更新:找到解决方案(请参阅答案)。
答案 0 :(得分:0)
线性代数救援:
assert len(runs) > 0
N = runs[0].shape[0]
R = len(runs)
# Iteratively populate the output matrix (dense)
S = np.zeros((N, N), dtype=np.int8)
for i, scan in enumerate(runs):
print("Adjacency", i)
S += np.matmul(scan, scan.T).astype(np.int8)
# Convert to sparse and return
return scipy.sparse.csr_matrix(S)