使用 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
,因为角度差异与您的X
和Y
轴的比例不同,我猜。
出于显而易见的原因,请勿在此数据集上使用欧几里得距离。
【讨论】:
感谢您提出这个建议 - 我的贡献忽略了一个事实,即您仍然需要计算重新参数化的距离,您在此处显示。 这会更容易。谢谢!现在我正在准备要集群的数据(在集群有意义之前需要进行一些认真的清理)。再次感谢! 回想一下,我意识到sin(phi1-phi2) == 0
如果(phi1-phi2) % pi == 0
,那么它们也可以指向相反的方向。这可以是有意的。如果不是,那么另外使用cos
术语可以解决问题。但不要只添加正方形:)
我没有为他弄清楚确切的数学,因为“角度数据”并不意味着它在球体上;所以我们缺乏信息。如果是球体上的数据,我会选择 Haversine 等。以上是关于使用 dbscan 对角度数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章