我有一个MxN
数组,其中M
是观察数,N
是每个向量的维数。从这个向量数组中,我需要计算向量之间的mean
和minimum
欧几里德距离。
在我看来,这需要我计算 M C 2 距离,这是一个O(n min(k,nk) )算法。我的M
大约是10,000,我的N
大约是1,000,这个计算需要大约45秒。
是否有更有效的方式来计算mean
和min
距离?也许是一种概率方法?我并不需要它准确,只是关闭。
答案 0 :(得分:0)
您没有描述您的向量来自哪里,也没有说明您将mean
和median
用于什么用途。以下是关于一般情况的一些观察。有限范围,误差容限和离散值可能会采用更有效的方法。
M点之间的mean
距离听起来是二次的,O(M ^ 2)。但是M / N是10,相当小,N很大,所以数据可能类似于1e3空间中的毛球。计算M点的质心,然后计算M到质心的距离,可能会在您的问题域中变得有用,很难说。
M点之间的minimum
距离更有趣。随机选择少量对,比如100,计算它们的距离,并将最小值的一半作为全局最小距离的估计值。 (如果需要,通过与下几个最小距离进行比较来验证。)现在使用空间UB-tree将每个点建模为正整数。这包括为M x N值找到N minima,添加常数使min变为零,缩放所以估计的全局最小距离对应于至少1.0,然后截断为整数。
有了这些变换后的矢量,我们准备将它们变成我们可以排序的UB树表示,然后对排序值进行最近邻空间查询。为每个点计算一个整数。将每个维度的值的低位移到结果中,然后迭代。继续迭代所有维度,直到非零位全部消耗并出现在结果中,然后继续下一个点。对整数结果值进行数字排序,得到类似于PostGIS索引的数据结构。
现在你有一个离散化的表示,支持对最近邻居的合理有效的查询(尽管N = 1e3很不方便)。在找到两个或多个粗粒度的邻近邻居之后,您可以查询原始矢量表示以获得它们之间的高分辨率距离,以获得更好的区分。如果您的数据分布结果显示有很大一部分点离开最近邻居的单个位,例如,氧原子的位置,每个都有一个伙伴,然后增加全局最小距离估计,以便低阶位提供足够的区分。
类似的离散化方法将适当地缩放,例如二维输入并标记最初为空的网格,然后扫描直接邻域。由于适当的缩放,这依赖于全球min在“小”邻域内。在您的情况下,您将标记一个N维网格。
答案 1 :(得分:0)
您也许可以使用某种Space Partitioning加快速度。
对于最小距离计算,您只需要考虑相同或相邻分区中的成对点。对于大概的平均值,您也许可以根据分区之间的距离和分区中的点数得出某种加权平均值。
答案 2 :(得分:-1)
我以前遇到过同样的问题,当我将值归一化后,它对我有用。因此,在计算距离之前,请尝试对数据进行归一化。