【问题标题】:scikit-learn AgglomerativeClustering and connectivityscikit-learn 凝聚聚类和连通性
【发布时间】:2014-10-28 06:09:02
【问题描述】:

我正在尝试使用 scikit-learn 中的 AgglomerativeClustering 来对某个地方的点进行聚类。点由存储在 _XY 中的坐标 (X,Y) 定义。

通过由下式定义的连接矩阵,集群仅限于少数邻居 C = kneighbors_graph(_XY, n_neighbors = 20).

我希望一些点不属于同一个集群,即使它们是邻居,所以我修改了连接矩阵以在这些点之间放置 0。

算法运行平稳,但最后,一些簇包含不应该在一起的点,即我强加了 _C = 0 的一些点。

从孩子们的角度来看,我可以看到问题出现在两个点 (i, j) 的集群已经形成并且 k 加入 (i,j) 时,即使 _C[i,k]=0。

所以我想知道当某些集群的大小大于 2 时,连接约束是如何传播的,在这种情况下没有定义 _C。

谢谢!

【问题讨论】:

    标签: scikit-learn connectivity hierarchical-clustering


    【解决方案1】:

    因此,在您的情况下似乎发生的情况是,尽管您主动断开了您不希望在一个集群中拥有的点,但这些点仍然是同一个连接组件的一部分,并且与它们关联的数据仍然暗示它们应该从某个级别连接到同一个集群。

    一般来说,AgglomerativeClustering 的工作方式如下:一开始,所有数据点都是单独的集群。然后,在每次迭代中,合并两个相邻的聚类,如果我们将原始数据与 L2 距离上的聚类均值进行比较,则与原始数据的总体差异增加是最小的。

    因此,尽管您切断了两个节点之间的直接链接,但它们可以通过中间节点聚集在一起更高一级。

    【讨论】:

    • 感谢您的回答!看看能不能写出来假设 C[i,j] = 1, C[j,k] = 1 和 C[i,k] = 0。i 和 k 不能链接。第一步,将 i 和 j 连接起来。然后 k 可以链接到集群 (i,j)。我认为,因为 C[i,k] = 0,k 无法加入。但事实上,因为 C[j,k] = 1,所以 (i,j) 和 k 之间可能存在联系。这就像定义 C[(i,j),k] = max(C[i,k], C[j,k])。
    • 请不要犹豫,问问题 - 用几句话解释机制并不简单
    • 完全正确——它们只是通过中介链接起来的。如果数据足够相似,我认为不可能禁止这些集群形成。当然,除非您完全断开组件。但在这种情况下,聚合器有时甚至会重新链接断开的组件。
    猜你喜欢
    • 2017-08-06
    • 2021-09-16
    • 2017-06-09
    • 2020-03-21
    • 2019-10-20
    • 2016-11-11
    • 2015-02-20
    • 2015-11-25
    • 2015-11-20
    相关资源
    最近更新 更多