Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 欧氏距离的高效计算_Python_Algorithm_Python 3.x_Euclidean Distance - Fatal编程技术网

Python 欧氏距离的高效计算

Python 欧氏距离的高效计算,python,algorithm,python-3.x,euclidean-distance,Python,Algorithm,Python 3.x,Euclidean Distance,我有一个MxN数组,其中M是观察数,N是每个向量的维数。从这个向量数组中,我需要计算向量之间的平均值和最小值欧氏距离 在我看来,这需要我计算MC2距离,这是一个O(nmin(k,n-k))算法。我的M约为10000,我的N约为1000,计算时间约为45秒 是否有更有效的方法来计算平均值和最小值距离?也许是一种概率方法?我不需要精确,只要接近即可。你没有描述向量的来源,也没有说明你将把的意思和中值放在哪里。以下是关于一般情况的一些观察结果。有限的范围、误差容限和离散值可能允许更有效的方法 M个点之

我有一个
MxN
数组,其中
M
是观察数,
N
是每个向量的维数。从这个向量数组中,我需要计算向量之间的
平均值
最小值
欧氏距离

在我看来,这需要我计算MC2距离,这是一个O(nmin(k,n-k))算法。我的
M
约为10000,我的
N
约为1000,计算时间约为45秒


是否有更有效的方法来计算
平均值
最小值
距离?也许是一种概率方法?我不需要精确,只要接近即可。

你没有描述向量的来源,也没有说明你将把
的意思
中值
放在哪里。以下是关于一般情况的一些观察结果。有限的范围、误差容限和离散值可能允许更有效的方法

M个点之间的
平均
距离听起来是二次的,O(M^2)。但是M/N是10,相当小,N很大,所以数据可能类似于1e3空间中的一个毛茸茸的球体。计算M个点的质心,然后计算M到质心的距离,可能在您的问题域中很有用,很难说

M个点之间的
最小距离更有趣。随机选择少量对,比如100对,计算它们的距离,取最小值的一半作为全局最小距离的估计值。(如果需要,通过比较下几个最小距离进行验证。)现在使用spatial将每个点建模为正整数。这包括为M x N值找到N个最小值,添加常数使最小值变为零,缩放使估计的全局最小距离至少对应于1.0,然后截断为整数

有了这些转换后的向量,我们就可以将它们转换为UB树表示,我们可以对其进行排序,然后对排序后的值进行最近邻空间查询。为每个点计算一个整数。将每个维度值的低位移到结果中,然后迭代。继续在所有维度上迭代,直到非零位全部消耗并出现在结果中,然后继续下一个点。对整型结果值进行数字排序,生成类似于PostGIS索引的数据结构

现在,您有了一个离散化表示,它支持合理有效的最近邻查询(尽管N=1e3不太方便)。在找到两个或多个粗粒度的近邻后,可以查询原始向量表示以获得它们之间的高分辨率距离,以便进行更精细的区分。如果您的数据分布中有很大一部分点离散化为与最近邻的距离为一位,例如氧原子的位置,每个氧原子都有一个伙伴,则增加全局最小距离估计值,以便低阶位提供足够的区分


类似的离散化方法将适当缩放,例如,二维输入并标记初始空网格,然后扫描邻近区域。这取决于由于适当的缩放,全局最小值位于“小”邻域内。在您的例子中,您将标记一个N维网格。

我以前也遇到过同样的问题,一旦我规范化了值,它就对我有效。因此,在计算距离之前,请尝试对数据进行标准化。

通过某种方法,您可能可以加快速度


对于最小距离计算,只需要考虑相同或嵌套分区中的点对。对于近似平均值,您可以根据分区之间的距离和分区内的点数得出某种加权平均值。

您可以发布当前代码吗?在我的脑海里,我只看到了O(m^2*n),也许我误解了什么。有趣的问题。但是,我不确定变量C_2和k是从哪里来的。正如pgreen2提到的,我认为O(n*m^2)算法是最直接的方法。完全公开,我是算法的新手,所以我的分析很可能是错的。然而,我找不到计算每对可能的向量之间距离的方法,这导致
M
choose
2
计算。从Mitch的链接中,我可以看到蛮力方法是怎样的O(k*n^2)。我还可以理解如何有效地计算集合的
最大距离,而不是
最小距离或
平均距离。感谢您的快速回复:)这里有一个很长的,但彻底的讨论和证明,可以在O(nlogn)中解决这个问题@Srinivas746矢量元素的大小可能对浮点稳定性有一定影响,但问题是关于时间复杂性。