python - 计算列表python列表中所有向量之间的欧几里得和闵可夫斯基距离的最快方法
问题描述
我一直在尝试计算列表列表中所有向量之间的欧几里得和闵可夫斯基距离。我没有太多高级的数学知识。
- 我通常使用 4 或 5 维向量
- 向量列表的大小范围从 0 到大约 200,000
- 在计算距离时,所有向量将具有相同的维度
在这个过程中,我依赖了这两个问题:
起初我的代码看起来像这样:
import numpy as np
def euclidean_distance_np(vec_list, single_vec):
dist = (np.array(vec_list) - single_vec) ** 2
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist)
return dist
def minkowski_distance_np(vec_list, single_vec, p_val):
dist = (np.abs(np.array(vec_list, dtype=np.int64) - single_vec) ** p_val).sum(axis=1) ** (1 / p_val)
return dist
当我有少量向量时,这很有效。我会计算单个向量与列表中所有向量的距离,并为列表中的每个向量一个一个地重复该过程,但是一旦列表长度变为 5 或 6 位,这些函数就会变得非常慢。
我设法改进了欧几里得距离计算,如下所示:
x = np.array([v[0] for v in vec_list])
y = np.array([v[1] for v in vec_list])
z = np.array([v[2] for v in vec_list])
w = np.array([v[3] for v in vec_list])
t = np.array([v[4] for v in vec_list])
res = np.sqrt(np.square(x - x.reshape(-1,1)) + np.square(y - y.reshape(-1,1)) + np.square(z - z.reshape(-1,1)) + np.square(w - w.reshape(-1,1)) + np.square(t - t.reshape(-1,1)))
但无法弄清楚如何实现上述计算方法来正确计算闵可夫斯基距离。所以,准确地说,我的问题是如何以与我上面提到的代码类似的方式计算 Minkowski 距离。
我也将不胜感激任何改进的想法或更好的方法来执行计算
解决方案
推荐阅读
- flutter - 有没有办法将一个有状态小部件的数据更新状态推送到另一个有状态小部件?
- linux - 启动运行脚本后未关闭的 tmux 会话
- java - 无法调用“”,因为“”为空
- c# - 在 c# 中使用 #line 指令来更改错误或警告的默认行号的原因是什么?
- ubuntu - ZSH 和 VSCode - 默认 Shell
- flutter - Flutter 在 Google 印度语键盘上的问题
- c++ - C++ 模板发送“错误参数”是一种不好的做法?
- ios - 如何将 JSON 中的字典与 Realm 一起使用?
- c++ - 在 tinkercad 中使用伺服库导致奇怪的行为
- html - 为什么使用 justify-content: center 时我的按钮不居中