Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的亲和传播_Python_Scikit Learn - Fatal编程技术网

python中的亲和传播

python中的亲和传播,python,scikit-learn,Python,Scikit Learn,我在使用sklearn的AffinityPropagation时看到一些奇怪的东西。我有一个4 x 4的numpy Ndaray-基本上是亲和力分数。sim[i,j]的亲和力得分为[i,j]。现在,当我输入affinitypropagation函数时,我总共得到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,

我在使用sklearn的AffinityPropagation时看到一些奇怪的东西。我有一个4 x 4的numpy Ndaray-基本上是亲和力分数。sim[i,j]的亲和力得分为[i,j]。现在,当我输入affinitypropagation函数时,我总共得到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样本亲和矩阵

文档()说


谢谢

根据您的描述,听起来您正在使用“成对相似矩阵”:
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
转换为伪距离。(这样做的原因是,如果您将相似性矩阵作为输入,我不知道亲和性传播将为您提供预期的结果):

话虽如此,我认为这就是你的解释的出发点:

这表示前3行是相似的,第4行本身是一个集群,第5行本身也是一个集群。共有3个簇

f.labels\uu
数组:

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

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

是的,Kevin,您是对的。我有一个成对的相似矩阵。不是n样本x n特征矩阵。这就是我的问题。如何表示适合于仿射传播算法的成对相似矩阵?我的错误是在我的问题中举了一个错误的例子。我已经用一个很好的例子纠正了它。你能解释一下“样本”的定义吗?在你的例子中,如果你说sample-0,那是什么?它应该是指一些对的集合(i,j)…对吗?我想我现在理解了输出。当我假设4x4矩阵有标签时,比如(“a”、“b”、“c”、“d”),那么我的示例:array([0,1,1,1])的输出就有意义了。这意味着a点属于集群0,b点、c点、d点属于集群1。你之前的评论似乎是正确的。
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.        ]])
array([0, 1, 1, 1, 0])