【发布时间】:2020-02-02 02:32:20
【问题描述】:
计算数组中每个点的最近邻(欧几里得)距离的最有效方法是什么?
我有一个 100k (X,Y,Z) 点的列表,我想计算最近邻距离的列表。距离的索引将对应点的索引。
我调查了 PYOD 和 sklearn 邻居,但这些似乎需要“教学”。我认为我的问题比这更简单。对于每个点:找到最近的邻居,计算距离。
示例数据:
points = [
(0 0 1322.1695
0.006711111 0 1322.1696
0.026844444 0 1322.1697
0.0604 0 1322.1649
0.107377778 0 1322.1651
0.167777778 0 1322.1634
0.2416 0 1322.1629
0.328844444 0 1322.1631
0.429511111 0 1322.1627...)]
计算 k = 1 个最近邻距离
结果格式:
results = [nearest neighbor distance]
示例结果:
results = [
0.005939372
0.005939372
0.017815632
0.030118587
0.041569616
0.053475883
0.065324964
0.077200014
0.089077602)
]
更新:
我已经实施了两种建议的方法。
- 使用 scipy.spatial.cdist 计算完整距离矩阵
- 使用半径 R 中最近的 X 个邻居来查找每个点的邻居距离子集并返回最小的。
结果是方法 2 比方法 1 更快,但实施起来要付出更多的努力(有道理)。
似乎方法 1 的限制因素是运行完整计算所需的内存,尤其是当我的数据集接近 10^5 (x, y, z) 点时。对于我的 23k 点数据集,捕获最小距离大约需要 100 秒。
对于方法 2,速度缩放为 n_radius^2。也就是说,“邻居半径平方”,这实际上意味着算法随着包含的邻居的数量线性缩放。使用大约 5 的半径(给定应用程序绰绰有余),对于 23k 点的集合,需要 5 秒才能提供与 point_list 本身顺序相同的分钟列表。 “精确解”与方法二的差分矩阵基本为零。
感谢大家的帮助!
【问题讨论】:
-
你知道这些距离的值应该是多少吗?将有助于获得预期的输出。
-
问题是什么?
-
到质心的距离?在所有点之间?
-
欢迎来到 SO。这不是讨论论坛或教程。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。
-
d_kennetz 是的。我在 JMP 中有输出。希望将其移植到 python。
标签: python knn nearest-neighbor euclidean-distance