Python 中的亲和力传播



我在使用sklearn的AffinityPropagation时看到一些奇怪的东西。我有一个 4 x 4 numpy ndarray - 这基本上是亲和力分数。sim[i, j] 的亲和力得分为 [i, j]。现在,当我输入 AffinityPropgation 函数时,我总共得到了 4 个标签。

下面是一个具有较小矩阵的类似示例:

In [215]: x = np.array([[1, 0.2, 0.4, 0], [0.2, 1, 0.8, 0.3], [0.4, 0.8, 1, 0.7], [0, 0.3, 0.7, 1]]
   .....: )
In [216]: x
Out[216]:
array([[ 1. ,  0.2,  0.4,  0. ],
       [ 0.2,  1. ,  0.8,  0.3],
       [ 0.4,  0.8,  1. ,  0.7],
       [ 0. ,  0.3,  0.7,  1. ]])
In [217]: clusterer = cluster.AffinityPropagation(affinity='precomputed')
In [218]: f = clusterer.fit(x)
In [219]: f.labels_
Out[219]: array([0, 1, 1, 1])

这说明(根据 Kevin),第一个样本(第 0 个索引行)本身就是一个聚类(聚类 # 0),其余样本位于另一个聚类(聚类 # 1)中。但是,我仍然不明白这个输出。这里的样本是什么?成员是什么?我想将一组对 (i, j) 分配给一个集群,另一组对分配给另一个集群,依此类推。

它看起来像一个 4 样本 x 4 特征矩阵。我不想要。这是问题所在吗?如果是这样,如何将其转换为漂亮的 4 样品 x 4 样品亲和基质?

文档(http://scikit-learn.org/stable/modules/generated/sklearn.cluster.AffinityPropagation.html)说

fit(X, y=None)
Create affinity matrix from negative euclidean distances, then apply affinity propagation clustering.
Parameters: 
X: array-like, shape (n_samples, n_features) or (n_samples, n_samples) :
Data matrix or, if affinity is precomputed, matrix of similarities / affinities.

谢谢!

根据你的描述,听起来你正在使用一个"成对相似矩阵":x(尽管你的示例数据没有显示这一点)。 如果是这种情况,您的矩阵应该是对称的,以便:sim[i,j] == sim[j,i]对角线值等于 1。 相似性数据示例S

S
array([[ 1.        ,  0.08276253,  0.16227766,  0.47213595,  0.64575131],
       [ 0.08276253,  1.        ,  0.56776436,  0.74456265,  0.09901951],
       [ 0.16227766,  0.56776436,  1.        ,  0.47722558,  0.58257569],
       [ 0.47213595,  0.74456265,  0.47722558,  1.        ,  0.87298335],
       [ 0.64575131,  0.09901951,  0.58257569,  0.87298335,  1.        ]])

通常,当您已经有一个距离矩阵时,您应该使用 affinity='precomputed' . 但在您的情况下,您使用的是相似性在此特定示例中,您可以使用 1-D 转换为伪距离。 (这样做的原因是,如果您给亲和力传播作为输入,我不知道亲和力传播会给你预期的结果):

1-D
array([[ 0.        ,  0.91723747,  0.83772234,  0.52786405,  0.35424869],
       [ 0.91723747,  0.        ,  0.43223564,  0.25543735,  0.90098049],
       [ 0.83772234,  0.43223564,  0.        ,  0.52277442,  0.41742431],
       [ 0.52786405,  0.25543735,  0.52277442,  0.        ,  0.12701665],
       [ 0.35424869,  0.90098049,  0.41742431,  0.12701665,  0.        ]])

话虽如此,我认为这就是您的解释不对的地方:

这说明前 3 行是相似的,第 4 行本身就是一个集群,第 5 行本身也是一个集群。共3组。

f.labels_数组:

array([0, 1, 1, 1, 0])

告诉您样本(不是行)0 和 4 在聚类 0 中,样本 2、3 和 4 在聚类 1 中。 对于 5 个样本问题,您不需要 25 个不同的标签,这没有意义。希望这有所帮助,请尝试演示(检查变量并将其与您的数据进行比较),该演示从原始数据开始;它应该可以帮助您确定亲和力传播是否适合您。

>根据此页面 https://scikit-learn.org/stable/modules/clustering.html您可以使用相似性矩阵进行亲和力传播。

最新更新