为什么光谱聚类会导致不相交的聚类?

数据挖掘 聚类 无监督学习 核心 rbf
2021-09-16 21:03:41

我正在做一个项目,我必须动态地聚集对象相对于一个坐标的位置。所以我本质上是在处理后续帧,每个帧代表一个一维数据集。聚类背后的直觉是用与簇内其他点距离相似并且可以自然连接的点形成簇。我使用谱聚类是因为它能够通过它们的连通性而不是绝对位置来聚类点,并且我设置 rbf 内核是因为它对距离的非线性变换。然而,在某些帧中,该算法会导致不自然的分配。一个例子是

import numpy as np
from sklearn.cluster import SpectralClustering

X = np.array([[51.08354988], [57.10594997], [70.51259995], [76.74425011], 
[61.24844971], [89.00615082], [98.55859985], [61.26575031], [88.35105019], 
[87.40859985]])

clustering = SpectralClustering(n_clusters = 4, random_state  = 42,
                                gamma = 5 / (X.max() - X.min()))
clustering.fit(X)

并且聚类的结果以下面的群图的形式呈现,所以这里只有 x 坐标很重要(每种颜色代表一个聚类,标签是数组索引):

在此处输入图像描述

我无法理解的是为什么标记为红色的点会聚集在一起,因为点 {4, 7} 和 {5, 8, 9} 之间的相似性应该非常低。我的第一个想法是,这可能是由不幸的随机初始化引起的,但我尝试了许多不同的随机状态,结果集群似乎是持久的。所以我猜这与选择的亲和力度量 ( rbf_kernel) 及其gamma参数有关。随着点随着每一帧移动,并且它们之间的距离在某种程度上取决于它们的整体范围,我尝试将 gamma 设置为5 / (X.max() - X.min()). 这背后的直觉是,如果范围更大,那么点之间的距离通常更大,我们应该更多地惩罚它们以获得相似的值exp(-gamma * ||x-y||^2)到那些在较小范围内获得的。但它似乎没有按预期工作,并导致错误的聚类,其中红色聚类由点除以绿色聚类形成)。我的期望是形成如下集群:{0, 1, 4, 7}, {2, 3}, {9, 8, 5} 和 {6} 或 {0}, {1, 4, 7}, {2, 3}, {5, 6, 8, 9}。

所以我的问题是:

  1. 亲和力选择及其gamma参数真的是这里的问题吗?

  2. 如果是这样,我该如何选择gamma更好?

  3. 否则,我应该考虑用什么方法来处理在此处介绍的同一集群中具有分离点的错误分配?

  4. (附带问题)是否有任何适合自动比较具有不同数量集群的集群的度量/索引?

@Edit:正如在此链接下可以观察到的那样,那些分离的集群会在短时间内发生,但问题似乎仍然是反复出现的。

3个回答

首先,请注意谱聚类对亲和核非常敏感。使用标准的 RBF 内核,我的经验是谱聚类通常会隔离异常值(在谱空间中),留下具有大量观测值的聚类,这些观测值可以相隔很远的距离。这是与直接 k-means 的一个主要区别:不再有距离的概念,它只是关于连通性。

在您的示例中显示的情况下,由于低维,结果是“奇怪的”:一维通常是光谱聚类不提供“逻辑”结果的情况。此外,你在几个方面都很不走运:

  • 簇数(4):尝试不同簇数,你会发现更琐碎的结果
  • 观察的位置:将#0向左移动,您可能会发现更有意义的结果
  • 观察次数少:#6 不被视为异常值,因为它靠近 #5、#8、#9 三元组。的确,一个区域的点数越多,它的影响就越大。这也是 #4 和 #7 可以被视为 (#5, #6, #8, #9) 集群的一部分,而不是 (#2, #3) 集群的一部分。尝试删除#9,看看结果如何突然变得有意义。
  • 选择的内核(我这边没试过,但是如果你增加伽玛值或者改变内核形状,结果可能会有很大差异)

TL; DR:您的案例是光谱聚类如何在观察和维度数量较少的情况下出错的一个例子。

光谱聚类对低维数据没有意义。

事实上,它会首先将您的数据投影到 4 维嵌入中,然后在那里运行 k-means。这很可能是这种行为的来源。

我宁愿使用实际位置和距离容差阈值。

我喜欢你的方法,但是

你说我使用谱聚类是因为它能够通过它们的亲和力而不是精确的位置来聚类点,这很酷。(也检查Affinityprop)但是然后您尝试使用距离/位置进行聚类。如果您想让它可重现,请尝试只测量距离的 gamma=0。

还有一点需要注意,随着数据的增长,这些基于亲和力的方法非常昂贵(光谱时间复杂度为 qubic+),除非您在小型(ish)数据集上使用它,或者您没有考虑一些特殊方法,否则我建议您不要这样做。例如,spectral 最初是为基于图形的问题而设计的。