【问题标题】:Coincidence matrix from array with clusters assignments来自数组的符合矩阵与集群分配
【发布时间】:2015-05-15 16:44:54
【问题描述】:

我有一个数组,其中包含分配给每个点的簇。

import numpy as np
cluster_labels = np.array([1,1,2,3,4])

我怎样才能得到这样的矩阵:

1 1 0 0 0 
1 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 
0 0 0 0 1

我敢肯定有什么比:

import numpy as np

cluster_labels = np.array([1,1,2,3,4])
n = cluster_labels.shape[0]
pairwise_clustering = np.zeros((n, n))

for i in xrange(n):
    for j in xrange(n):
        if cluster_labels[i] == cluster_labels[j]:
            pairwise_clustering[i,j] = 1

print pairwise_clustering


[[ 1.  1.  0.  0.  0.]
 [ 1.  1.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.]]

编辑(奖励): 我对一组 $n$ cluster_labels 的平均成对聚类感兴趣。所以我想直接从许多cluster_labels的数组中得到pairwise_clustering的平均值:

n_cluster_labels = np.array([[1,1,2,3,4],
                             [1,2,3,3,4],
                             [1,1,2,3,4]])

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如果不了解问题本身,很难说你的所作所为是否是解决问题的最佳方法。

    但是,可以用更少的代码获得您正在寻找的矩阵:

    x = np.array([1,1,2,3,4])
    (x[None,:] == x[:,None]).astype(int)
    

    从概念上讲,它与您的代码相同。它只是使用了更多 numpy 的功能,而不是 python for-loops。

    x 索引为x[None,:] 添加了一个长度为1 的虚拟轴。然后我们利用numpy 的广播功能并在广播的数组上逐元素应用相等运算符。最后,我们将布尔结果转换为整数。 (将int 替换为float 以获取浮点数)。

    【讨论】:

    • 谢谢李明!您需要什么样的额外信息?我只有 $N$ 聚类建议(每个点都有一个标签),我想得到这些成对矩阵。实际上我会取成对矩阵的平均值。
    • @alberto 我很可能不是您所在领域的专家。例如。我不确定集群在这种情况下的真正含义。所以,阅读你的问题让我想到了XY-problem。第一行只是作为免责声明,我假设您确实需要来自该输入的这些形状的矩阵。如果是这样的话,那就没什么好担心的了。
    猜你喜欢
    • 2016-06-07
    • 2014-01-20
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2018-02-12
    • 2018-08-29
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多