【问题标题】:Clustering from an Affinity Matrix in Python从 Python 中的亲和矩阵聚类
【发布时间】:2014-12-18 06:27:39
【问题描述】:

我正在尝试定位类似对象的集群。我为每个对象到对象的比较计算了一个值,并创建了一个如下形式的矩阵:

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)等,但它没有按预期聚集。

对我缺少什么的想法?

附加信息 2014 年 10 月 24 日:

我正在对我的对象进行成对比较,并从中生成一个数字,表明每个对象与其他对象的相关程度。许多这些对象根本不相关,因此它们产生“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]]

我的研究表明,Affinity Propagation 擅长在稀疏矩阵中寻找聚类,并且我的成对比较有效地生成了“预先计算”的亲和矩阵。

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

问题:

是否需要某种处理才能从我描述的那种矩阵开始生成有意义的集群?

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

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

【问题讨论】:

    标签: python scikit-learn cluster-analysis


    【解决方案1】:

    0 不是一个神奇的“不链接”值。

    由于对象 3 和 4 的亲和性与 1、2 或 5相同,因此它们分配到何处无关紧要;它们的质量大致相同。

    1 和 2 的内聚性更强,可能更适合将 3 和 4 分配在那里;并且生产不止一次集群的愿望可能会导致 5 保持分离。但它也可能只是随机的,对象 3 和 4 被分配到最佳亲和力的第一个示例(来自集群 1,2);对象 5 只是保持独立,至少有两个组件。

    使用真实数据,而不是手工制作的相似性。

    【讨论】:

    • 必须有一个值表示“不链接”。 (真的,“链接非常薄弱。”)查看这些数据的人会很容易找到一个由 1-2 组成的集群和一个由 3-4-5 组成的集群。该算法错过了它意味着我用错了。
    • 也许你应该给 3-4-5 一个比 0 更高的亲和力。
    • 我尝试将零替换为:0.1、10 和 90。所有三个尝试都产生了 cls = [0 0 0 0 1]。我的(基本)研究向我指出了 Affinity Propagation 方法,因为我有一个稀疏矩阵(很多情况下没有观察到链接),而 AP 对于这样的矩阵是有效的。
    • 我没有说全部替换为零。如果您希望它们链接,只需 3、4、5 的那些。
    • 好的...怎么样?如果我编写代码来更改“空”行/列的值,它适用于上面的简单情况(如果我用 -10 填写行/列 3、4、5,它现在将 1-2 和 3-4 分组-5.) 但是如果我创建集群 1-2 和 3-4 并将 5 留空(用我的新代码填充 -10)它现在创建集群 1-2-3-4 和集群 5,这是不对的. “如果要链接,请替换零”的算法是什么?
    猜你喜欢
    • 2016-01-19
    • 2014-11-13
    • 2017-12-01
    • 2013-04-14
    • 1970-01-01
    • 2012-05-23
    • 2017-12-18
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多