估算两个群集之间的最小距离

时间:2016-01-06 17:20:11

标签: algorithm cluster-analysis distance approximation

我正在为数百万个50-1000维点设计一个凝聚的,自下而上的聚类算法。在我的算法的两个部分中,我需要比较两个点的集群并决定两个集群之间的分离。 精确距离是在所有点P1-P2上取得的最小欧几里德距离,其中P1取自簇C1,P2取自簇C2。如果C1有X点且C2有Y点,那么这需要X * Y距离测量。

我目前以需要X + Y测量的方式估算这个距离:

  1. 找到群集C1的质心Ctr1。
  2. 在群集C2中找到最接近Ctr1的点P2。 (Y比较。)
  3. 在C1中找到最接近P2的点P1。 (X比较。)
  4. P1到P2的距离是簇C1和C2之间距离的近似度量。它是真实价值的上限。
  5. 如果簇大致为球形,则效果非常好。我的测试数据由椭球高斯簇组成,因此效果很好。但是,如果簇具有奇怪的,折叠的,弯曲的形状,则可能产生差的结果。我的问题是:

    是否存在使用甚至少于X + Y距离测量的算法,并且在一般情况下产生良好的准确度?

    OR

    是否存在一种算法(像我的一样)使用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?

    注意:我刚刚发现这被称为双色最近对问题。

    有关上下文,以下是整体群集算法的概述:

    1. 第一遍使用空间填充曲线( Hilbert曲线)将最密集的区域合并为小簇。它错过了异常值,并且经常无法合并彼此非常接近的相邻聚类。但是,它确实发现了一个特征最大连锁距离。所有以小于此特征距离分隔的点必须聚集在一起。此步骤没有预定义数量的聚类作为其目标。

    2. 如果最小距离小于最大连锁距离,则第二遍通过将聚类组合在一起来执行单连锁聚集。这不是层次聚类;它是基于分区的。将组合彼此最小距离小于该最大连杆距离的所有簇。此步骤没有预定义数量的聚类作为其目标。

    3. 第三遍执行额外的单链接聚合,对所有簇间距离进行排序,并且仅组合簇,直到簇的数量等于预定义的目标簇数。它处理一些异常值,更喜欢只合并具有大群集的异常值。如果存在许多异常值(通常是异常值),则可能无法减少目标群集的数量。

    4. 第四遍将所有剩余的离群值与最近的大型群集合并,但不会导致大型群集与其他大型群集合并。 (这可以防止两个相邻的集群意外地合并,因为它们的异常值在它们之间形成一条细链。)

2 个答案:

答案 0 :(得分:0)

您可以使用索引。这是非常经典的解决方案。

空间索引可以帮助您在大致O(log n)时间内找到任何点的最近邻居。因此,如果您的集群具有n和m个对象,请选择较小的集群并索引较大的集群,以在O(n log m)或O(m log n)中找到最接近的对。

更简单的启发式方法是多次迭代您的想法,缩小您的候选人集。所以你从两个星团中找到一对好的物体a,b。然后丢弃每个簇中必须(通过三角形不等式)进一步分开的所有对象(使用上限!)。 然后你重复这个,但再次选择相同的a,b。一旦候选集停止改进,只对剩余对象进行成对比较。这种方法的最坏情况应该是O(n * m)。

答案 1 :(得分:0)

我找到了一篇论文,描述了最接近双色点问题的线性时间,随机,ε近似算法:

http://www.cs.umd.edu/~samir/grant/cp.pdf

我将尝试实现它并查看它是否有效。

更新 - 进一步研究后,显然运行时间与3 ^ D成比例,其中D是维数。这是无法接受的。在尝试了其他几种方法后,我点击了以下内容。

  1. 使用有效但不完整的方法对K个簇进行粗略聚类。此方法将正确地聚集某些点,但会产生过多的聚类。这些小集群仍有待进一步整合,形成更大的集群。此方法将确定被视为位于同一群集中的点之间的上限距离DMAX。
  2. 按希尔伯特曲线顺序对点进行排序。
  3. 丢弃紧接在同一群集中的邻居之前和之后的所有点。通常情况下,这些是群集的内部点,而不是表面点。
  4. 对于每个点P1,向前搜索,但不比同一群集中的下一个点更远。
  5. 计算从集群C1的点P1到集群C2的每个访问点P2的距离,如果它小于C1和C2中各点之间测量的任何先前距离,则记录距离。
  6. 但是,如果已将P1与C2中的某个点进行比较,请不要再次执行此操作。只对P1和C2中的任何一点进行单一比较。
  7. 在完成所有比较后,记录的K(K-1)距离最多,并且由于它们大于DMAX而被丢弃。这些是估计的最近点距离。
  8. 如果群集比DMAX更近,则执行群集之间的合并。
  9. 很难想象希尔伯特曲线如何在星团之间摆动,所以我对这种找到最近对的方法的效率的估计是它与K ^ 2成正比。但是,我的测试店更接近K.它可能在K * log(K)附近。进一步的研究是必要的。

    至于准确度:

    • 将每个点与其他每个点进行比较是100%准确的。
    • 使用我的问题中概述的质心方法,距离大约为0.1%。
    • 使用此方法可以发现最差10%的距离太高,平均5%的距离太高。然而,真正最接近的集群几乎总是在第一个到第三个最接近的集群中出现,所以在质量上它是好的。使用此方法的最终聚类结果非常好。我的最终聚类算法似乎与DNK或DNK * Log(K)成比例。
相关问题