我在使用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个索引行)是一个集群(Cluster#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.
谢谢!
答案 0 :(得分:1)
根据您的描述,听起来您正在使用"成对相似性矩阵":x
(尽管您的示例数据未显示)。如果是这种情况,您的矩阵应为symmertric,以便: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
转换为伪距离。 (这样做的原因是因为我不知道如果你给它一个相似性矩阵作为输入,Affinity Propagation会给你预期的结果):
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个不同的标签,这是没有意义的。希望这有点帮助,尝试demo(检查沿途的变量并将它们与您的数据进行比较),从原始数据开始;它应该可以帮助您确定Affinity Propagation是否适合您的聚类算法。