我正在做一个项目,我必须动态地聚集对象相对于一个坐标的位置。所以我本质上是在处理后续帧,每个帧代表一个一维数据集。聚类背后的直觉是用与簇内其他点距离相似并且可以自然连接的点形成簇。我使用谱聚类是因为它能够通过它们的连通性而不是绝对位置来聚类点,并且我设置 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}。
所以我的问题是:
亲和力选择及其
gamma参数真的是这里的问题吗?如果是这样,我该如何选择
gamma更好?否则,我应该考虑用什么方法来处理在此处介绍的同一集群中具有分离点的错误分配?
(附带问题)是否有任何适合自动比较具有不同数量集群的集群的度量/索引?
@Edit:正如在此链接下可以观察到的那样,那些分离的集群会在短时间内发生,但问题似乎仍然是反复出现的。
