从多种不同大小的聚类结果创建邻接矩阵

时间:2018-02-22 10:51:02

标签: python networkx

我已经在同一数据集上收集了几个聚类算法的输出,基于此我想生成一个邻接矩阵,表明任意两个样本聚集在一起的运行次数。即对于每个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库可能加快速度吗?有没有明显的方法可以做到这一点?

更新:找到解决方案(请参阅答案)。

1 个答案:

答案 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)