gpt4 book ai didi

python - python中的亲和性传播

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:22 24 4
gpt4 key购买 nike

我在使用 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(尽管您的示例数据并未显示)。如果是这种情况,您的矩阵应该是 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 转换为伪距离。 (这样做的原因是因为我不知道如果你给它一个相似矩阵作为输入,亲和传播会给你预期的结果):

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. ]])

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

This says that the first 3-rows are similar, 4th row is a cluster on its own, and the 5th row is also a cluster on its own. Totally of 3 clusters.

f.labels_ 数组:

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

告诉您样本(不是行)0 和 4 在集群 0 中并且样本 2、3 和 4 在集群 1 中。您不5 个样本的问题不需要 25 个不同的标签,那是没有意义的。希望这能有所帮助,试试 demo(沿途检查变量并将它们与您的数据进行比较),它从原始数据开始;它应该可以帮助您确定亲和传播是否是适合您的聚类算法。

关于python - python中的亲和性传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com