使用 dbscan 对角度数据进行聚类

Posted

技术标签:

【中文标题】使用 dbscan 对角度数据进行聚类【英文标题】:clustering with angular data using dbscan 【发布时间】:2014-07-24 04:59:35 【问题描述】:

我需要以 X、Y、Phi 的形式对数据点进行聚类。现在我使用 DBSCAN (sklearn)。除了一件事之外,聚类有效:Phi 是角度数据,它是模 2*Pi。因此,Phi=0 附近的聚类是不正确的。有什么技巧可以解决这个问题吗?我找不到一个或自己编一个有效的。

谢谢。

【问题讨论】:

【参考方案1】:

圆形边界条件在傅立叶框架之外实际上并不容易实现。

您可以尝试通过将X, Y, Phi 替换为X, Y, a * cos(Phi), a * sin(Phi) 来尝试重新参数化,其中a > 0 是一种比例因子,需要正确选择,以便此投影到二维空间中以按照您在聚类中所需的方式运行。首先检查a = 1(如果它对纯Phi 工作正常,那么这是一个很好的候选者),然后检查a 以您剩余数据X, Y 的数量级。

这背后的想法是将Phi替换为相位的“真实”复杂“含义”,即exp(1j * Phi),但始终保持真实。

然后您继续根据此重新参数化计算距离,例如欧几里得:

dist = ((np.array([X1, Y1, a* np.cos(Phi1), a * np.sin(Phi1)]) - np.array([X2, Y2, a * np.cos(Phi2), a * np.sin(Phi2)])) ** 2).sum()

在将每一对输入到 DBSCAN 对象之前,您对每一对都执行此操作。

【讨论】:

非常感谢您提出这个想法。我需要考虑一下,看看这是否可行(并希望试一试)。 其实他们易于使用。例如,这可能会奏效:distance=(x1-x2)**2+(y1-y1)**2+sin(phi1-phi2)**2 是的,当然!我认为您的提议几乎(几乎)等同于对我提出的重新参数化进行欧几里得距离,因为三角恒等式如 sin(phi1 - phi1) = sin(phi1)cos(phi2) - cos(phi1)sin(phi2) 及其相反。但我坚持认为,一般来说,圆形边界条件不容易处理。【参考方案2】:

DBSCAN 可以使用任意距离

所以首先定义一个距离函数(这可能会涉及一些三角函数),然后将其作为相似度插入 DBSCAN。

你可能会使用这样的东西:

distance = (x1-x2)**2 + (y1-y1)**2 + factor * sin(phi1-phi2)**2

但您需要仔细选择您的体重factor,因为角度差异与您的XY 轴的比例不同,我猜。

出于显而易见的原因,请勿在此数据集上使用欧几里得距离。

【讨论】:

感谢您提出这个建议 - 我的贡献忽略了一个事实,即您仍然需要计算重新参数化的距离,您在此处显示。 这会更容易。谢谢!现在我正在准备要集群的数据(在集群有意义之前需要进行一些认真的清理)。再次感谢! 回想一下,我意识到sin(phi1-phi2) == 0 如果(phi1-phi2) % pi == 0,那么它们也可以指向相反的方向。这可以是有意的。如果不是,那么另外使用cos 术语可以解决问题。但不要只添加正方形:) 我没有为他弄清楚确切的数学,因为“角度数据”并不意味着它在球体上;所以我们缺乏信息。如果是球体上的数据,我会选择 Haversine 等。

以上是关于使用 dbscan 对角度数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

DBSCAN 按位置和密度对数据进行聚类

使用 python 和 DBSCAN 对高维数据进行聚类

在给定 x,y,z 坐标时使用 DBSCAN 算法对 3D 点进行聚类

opencv:如何使用kmeans()按角度聚类

选择和实施聚类方法:DBSCAN 其他?

DBSCAN 聚类与名称不同(Python)