【问题标题】:affinity propagation in pythonpython中的亲和力传播
【发布时间】:2016-05-31 09:15:44
【问题描述】:

我在使用 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-sample x 4-sample 亲和矩阵?

文档 (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.

谢谢!

【问题讨论】:

    标签: python scikit-learn


    【解决方案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'。但就您而言,您使用的是 similarity在这个具体示例中,您可以使用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])
    

    告诉您 samples(不是行)0 和 4 在集群 0 中,并且 samples 2、3 和 4 在集群 1 中。您不知道对于 5 个样本问题,不需要 25 个不同的标签,这是没有意义的。希望这会有所帮助,试试demo(检查变量并将它们与您的数据进行比较),它以原始数据开头;它应该可以帮助您确定 Affinity Propagation 是否适合您。

    【讨论】:

    • 是的,凯文,你是对的。我有一个成对的相似度矩阵。不是 n 样本 x n 特征矩阵。而且,这是我的问题。如何表示适合 AffinityPropagation 算法的成对相似度矩阵?在我的问题中给出错误的例子是我的错误。我用一个很好的例子纠正了它。
    • 你能解释一下这里“样品”的定义吗?在您的示例中,如果您说 sample-0,那是什么?它应该引用一些对 (i, j)...对吗?
    • 我想我现在理解输出了。当我假设 4 x 4 矩阵有标签时,例如 ("a", "b", "c", "d"),那么,我的示例的输出:array([0, 1, 1, 1])是有道理的。这意味着点 a 属于 cluster-0,点 b、c、d 属于 cluster-1。
    • 您之前的评论似乎是在正确的轨道上。
    【解决方案2】:

    据此页面https://scikit-learn.org/stable/modules/clustering.html 您可以为 AffinityPropagation 使用相似度矩阵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2017-06-19
      • 2019-10-15
      • 2017-09-21
      • 1970-01-01
      • 2013-08-06
      相关资源
      最近更新 更多