【发布时间】:2016-04-10 21:15:15
【问题描述】:
我正在为数百万个 50-1000 维点设计一个凝聚的、自下而上的聚类算法。在我的算法的两个部分中,我需要比较两个点集群并确定两个集群之间的分离。 精确距离是所有点对 P1-P2 上的最小欧几里得距离,其中 P1 取自集群 C1,P2 取自集群 C2。如果 C1 有 X 点,C2 有 Y 点,那么这需要 X*Y 距离测量。
我目前以需要 X+Y 测量的方式估算此距离:
- 找到簇 C1 的质心 Ctr1。
- 在簇 C2 中找到最接近 Ctr1 的点 P2。 (Y 比较。)
- 在 C1 中找到最接近 P2 的点 P1。 (X 次比较。)
- 从 P1 到 P2 的距离是集群 C1 和 C2 之间距离的近似度量。它是真实值的上限。
如果集群大致呈球形,则效果很好。我的测试数据是由椭球高斯簇组成的,所以效果很好。然而,如果集群有奇怪的、折叠的、弯曲的形状,它可能会产生很差的结果。我的问题是:
是否有一种算法使用的距离测量值甚至少于 X+Y 距离测量值,并且在平均情况下会产生良好的准确度?
或
有没有一种算法(像我的一样)使用 X+Y 距离测量但比我的精度更高?
(我正在用 C# 编程,但是用伪代码或任何其他语言描述算法都可以。请避免引用 R 或 Matlab 中的专用库函数。具有概率保证的算法,例如“95% 的机会”距离在最小值的 5% 以内”是可以接受的。)
注意:我刚刚发现了这个相关的问题,它讨论了一个类似的问题,但不一定适用于高维度。 Given two (large) sets of points, how can I efficiently find pairs that are nearest to each other?
注意:我刚刚发现这被称为双色最近对问题。
就上下文而言,这里是整个聚类算法的概述:
第一遍使用空间填充曲线(希尔伯特曲线)将最密集的区域合并为小簇。它错过了异常值,并且经常无法合并彼此非常接近的相邻集群。但是,它确实发现了一个特征最大链接距离。相隔小于该特征距离的所有点必须聚集在一起。此步骤没有预定义的集群数量作为其目标。
如果最小距离小于最大链接距离,第二次通过将集群组合在一起来执行单链接聚集。这不是层次聚类;它是基于分区的。将组合彼此之间的最小距离小于该最大链接距离的所有集群。此步骤没有预定义的集群数量作为其目标。
第三遍执行额外的单链接聚集,对所有集群间距离进行排序,并且仅组合集群,直到集群数量等于预定义的目标集群数量。它处理一些离群值,更喜欢只将离群值与大型集群合并。如果有很多异常值(通常是这样),这可能无法减少目标的聚类数量。
第四次将所有剩余的异常值与最近的大集群合并,但不会导致大集群与其他大集群合并。 (这可以防止两个相邻的簇由于它们的异常值在它们之间形成一条细链而意外合并。)
【问题讨论】:
-
您尝试过类似that 的方法吗?
-
不!知道问题的“名称”会有所帮助!谢谢!我会读这篇文章。
-
文章中的有趣算法。但是,递归分治算法对 D(维数)的依赖是一个问题,因为对我来说,D 通常大于 K(簇数)。我会进一步研究它。
-
您可以尝试降低维度,还是所有维度都大致同等重要?
-
@kfx - 在我的真实世界数据中,我确定了冗余维度并将其从 40,000 个维度减少到 950 个维度。在后续处理中,我按人口对邮政编码进行加权,但在聚类中,所有不冗余的维度都被认为是同等重要的。
标签: algorithm cluster-analysis distance approximation