目前我以一种需要X+Y次测量的方式估计这个距离:
1. 找到簇C1的质心Ctr1。 2. 找到距离Ctr1最近的簇C2中的点P2。(Y次比较。) 3. 找到距离P2最近的C1中的点P1。(X次比较。) 4. P1到P2的距离是簇C1和C2之间距离的近似度量。它是真实值的上限。
如果簇大致球形,则这种方法效果非常好。我的测试数据由椭圆高斯簇组成,因此它非常有效。但是,如果簇具有奇怪、折叠、弯曲的形状,则可能会产生较差的结果。我的问题是:
是否有一种算法可以使用少于X+Y的距离测量,在平均情况下产生良好的准确度?
或者
是否有一种算法(像我的算法一样)使用X+Y的距离测量,但提供比我的算法更好的准确度?
(我正在使用C#进行编程,但伪代码或任何其他语言的算法描述都可以。请避免引用来自R或Matlab的专门库函数。具有概率保证的算法,如“距离在最小值的5%内的95%机会”是可接受的。)
注意:我刚发现了这个相关问题,它讨论了类似的问题,但不一定针对高维度。 给定两组(大)点,如何有效地找到彼此最近的对?
注意:我刚发现这被称为二色最近对问题。
为了背景,这里是整体聚类算法的概述:
第一次遍历使用空间填充曲线(Hilbert Curve)将最密集的区域合并为小群集。它会忽略离群值,并且通常无法合并非常接近的相邻群集。但是,它确实发现了一个特征的最大链接距离。所有距离小于此特征距离的点必须聚类在一起。此步骤没有预定义的目标聚类数。
第二次遍历通过将最小距离小于最大链接距离的群集组合在一起来执行单链接凝聚。这不是分层聚类;它是基于分区的。所有彼此之间最小距离小于此最大链接距离的群集都将被合并。此步骤没有预定义的目标聚类数。
第三次遍历执行额外的单链接凝聚,对所有群集之间的距离进行排序,并仅在群集数量等于预定义的目标聚类数时才合并群集。它处理一些离群值,更喜欢仅将离群值与大型群集合并。如果有许多离群值(通常如此),则可能无法将聚类数减少到目标。
第四次遍历将所有剩余的离群值与最近的大型群集组合,但不会导致大型群集与其他大型群集合并。(这可以防止由于其离群值在它们之间形成细链而意外合并两个相邻的群集。)