我正在为数百万个50-1000维点设计一个凝聚的,自下而上的聚类算法。在我的算法的两个部分中,我需要比较两个点的集群并决定两个集群之间的分离。 精确距离是在所有点P1-P2上取得的最小欧几里德距离,其中P1取自簇C1,P2取自簇C2。如果C1有X点且C2有Y点,那么这需要X * Y距离测量。
我目前以需要X + Y测量的方式估算这个距离:
如果簇大致为球形,则效果非常好。我的测试数据由椭球高斯簇组成,因此效果很好。但是,如果簇具有奇怪的,折叠的,弯曲的形状,则可能产生差的结果。我的问题是:
是否存在使用甚至少于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?
注意:我刚刚发现这被称为双色最近对问题。
有关上下文,以下是整体群集算法的概述:
第一遍使用空间填充曲线( Hilbert曲线)将最密集的区域合并为小簇。它错过了异常值,并且经常无法合并彼此非常接近的相邻聚类。但是,它确实发现了一个特征最大连锁距离。所有以小于此特征距离分隔的点必须聚集在一起。此步骤没有预定义数量的聚类作为其目标。
如果最小距离小于最大连锁距离,则第二遍通过将聚类组合在一起来执行单连锁聚集。这不是层次聚类;它是基于分区的。将组合彼此最小距离小于该最大连杆距离的所有簇。此步骤没有预定义数量的聚类作为其目标。
第三遍执行额外的单链接聚合,对所有簇间距离进行排序,并且仅组合簇,直到簇的数量等于预定义的目标簇数。它处理一些异常值,更喜欢只合并具有大群集的异常值。如果存在许多异常值(通常是异常值),则可能无法减少目标群集的数量。
第四遍将所有剩余的离群值与最近的大型群集合并,但不会导致大型群集与其他大型群集合并。 (这可以防止两个相邻的集群意外地合并,因为它们的异常值在它们之间形成一条细链。)
答案 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是维数。这是无法接受的。在尝试了其他几种方法后,我点击了以下内容。
很难想象希尔伯特曲线如何在星团之间摆动,所以我对这种找到最近对的方法的效率的估计是它与K ^ 2成正比。但是,我的测试店更接近K.它可能在K * log(K)附近。进一步的研究是必要的。
至于准确度: