从Python中的亲和矩阵聚类

时间:2014-10-22 17:39:08

标签: python scikit-learn cluster-analysis

我试图找到类似对象的集群。我为每个对象到对象的比较计算了一个值,并创建了一个形式的矩阵:

header =  [1, 2, 3, 4, 5]
matrix = [[0, 100, 0, 0, 0]
          [100, 0, 0, 0, 0]
          [0, 0, 0, 0, 0]
          [0, 0, 0, 0, 0]
          [0, 0, 0, 0, 0]]

我将矩阵传递给sklearn Affinity Propagation模块:

matrix = np.array(matrix)
cluster = AffinityPropagation(preference="precomputed")
cls = cluster.fit_predict(matrix)

在给出的示例中,我希望将1和2聚类,因为1-2 / 2-1是100,所有其他值都是零。但是cls数组并没有反映出这一点:

cls = [0 0 0 0 1]

表示1,2,3和4是一个群集,5是单独的群集。

我尝试通过右上角三角矩阵,改变值的大小(即0-1副0-100)等,并且没有按预期聚类。

关于我缺少什么的想法?

ADDITIONAL INFO 10/24/2014:

我正在对我的对象进行成对比较,并从中生成一个数字,表示每个对象与其他对象的关系。许多这些对象根本不相关,因此它们会产生“0”值。

这将创建一个稀疏的n乘n矩阵,其中n大约为10到100个对象。

从视觉上来说,对这些对象进行“聚类”以进行进一步分析是微不足道的。在下面的情况中,1涉及2,而2涉及3,但是1和3并不直接相关。我将继续使用1,2和3进行处理,并忽略4和5.(在我的实际数据中,我可能在单个矩阵中有多个有效的聚类)。

header =  [1,   2,   3,   4,   5]
matrix = [[0,  100,  0,   0,   0]
          [100, 0,  96,  0,  0]
          [0,  96,  0,   0,   0]
          [0,   0,   0,   0,   0]
          [0,   0,   0,   0,   0]]

我的研究表明亲和传播很擅长在稀疏矩阵中找到聚类,而且我的成对比较有效地产生了一个“预先计算的”亲和矩阵。

虽然很容易在视觉上找到这些集群,但我希望将其自动化,以便将其与之前和之后的代码集成。但是,正如原帖所示,我没有生成有意义的集群。

问题:

是否需要进行某种处理以从我描述的矩阵类型开始生成有意义的簇?

我是否忽略了一个步骤或以其他方式在算法中插入错误,使其无法找到我的群集?

我应该在这种数据上使用不同的聚类方法(DBSCAN,k-means等)吗?

1 个答案:

答案 0 :(得分:1)

0不是魔术"不链接"值。

由于对象3和4的亲和力是相同到1,2或5,因此它们被分配到的位置并不重要;它们的质量大致相同。

1和2的强大凝聚力可能使得在那里分配3和4更为可取;并且生产不止一次的集群的愿望可能会使这5个集团保持独立。但它也可能只是随机的,对象3和4被分配给最佳亲和力的第一个样本(来自簇1,2);并且对象5仅保持分离以具有至少两个组件。

使用真实数据,而不是手工制作的亲和力。