Pau*_*och 8 algorithm cluster-analysis distance approximation
我正在为数百万个50-1000维点设计一个凝聚的,自下而上的聚类算法.在我的算法的两个部分中,我需要比较两个点的集群并决定两个集群之间的分离.的精确距离是接管点P1-P2的所有对,其中P1是从集群C1取出并P2从集群C2拍摄的最小欧几里得距离.如果C1具有X点且C2具有Y点,则这需要X*Y距离测量.
我目前估计这个距离需要X + Y测量:
如果簇是大致球形的,这非常有效.我的测试数据由椭球高斯簇组成,因此效果很好.但是,如果簇具有奇怪的,折叠的,弯曲的形状,则可能产生差的结果.我的问题是:
是否存在使用甚至少于X + Y距离测量的算法,并且在一般情况下产生良好的精度?
要么
是否有一种算法(像我的一样)使用X + Y距离测量,但提供的精度比我的更高?
(我在C#中对此进行编程,但是伪代码或任何其他语言的算法描述都很好.请避免使用R或Matlab中的专用库函数.具有概率保证的算法,如"距离的95%几率"在最小值的5%范围内"是可以接受的."
注意:我刚刚发现了这个相关的问题,它讨论了类似的问题,但不一定是针对高维度的问题.给定两个(大)点集,我如何有效地找到彼此最近的对?
注意:我刚刚发现这被称为双色最近对问题.
对于上下文,以下是整体聚类算法的概述:
第一次通过使用空间填充曲线(希尔伯特曲线)将最密集的区域合并成小的簇.它错过了异常值,并且经常无法合并彼此非常接近的相邻聚类.但是,它确实发现了一个特征性的最大连杆距离.所有以小于此特征距离分隔的点必须聚集在一起.此步骤没有预定义数量的集群作为其目标.
如果它们的最小距离小于最大连杆距离,则第二次通过通过将簇组合在一起来执行单连杆聚集.这不是层次聚类; 它是基于分区的.将组合彼此的最小距离小于该最大连杆距离的所有簇.此步骤没有预定义数量的集群作为其目标.
第三遍执行额外的单链接聚集,对所有簇间距离进行排序,并且仅组合簇,直到簇的数量等于预定义的目标簇数.它处理一些异常值,更喜欢只合并具有大簇的异常值.如果存在许多异常值(通常是异常值),则可能无法减少到目标的簇数.
第四遍将所有剩余的异常值与最近的大型集群组合在一起,但不会导致大型集群与其他大型集群合并.(这可以防止两个相邻的簇意外地合并,因为它们的异常值在它们之间形成一条细链.)
我找到了一篇论文,描述了用于最接近双色点问题的线性时间、随机、epsilon 近似算法:
http://www.cs.umd.edu/~samir/grant/cp.pdf
我将尝试实施它,看看它是否有效。
更新 - 经过进一步研究,很明显,运行时间与 3^D 成正比,其中 D 是维度数。这是无法接受的。在尝试了其他几种方法之后,我想到了以下方法。
很难想象希尔伯特曲线如何在簇之间摆动,因此我对这种找到最接近对的方法的效率的估计是它与 K^2 成正比。然而,我的测试发现它更接近 K。它可能在 K*log(K) 左右。进一步的研究是必要的。
至于准确度: