【问题标题】:Euclidean distance between the two points using vectorized approach使用矢量化方法的两点之间的欧几里得距离
【发布时间】:2021-06-18 18:40:08
【问题描述】:

我有两个大的numpy 数组,我想使用sklearn 计算欧几里得距离。下面的 MRE 在最终结果中实现了我想要的,但由于我的 RL 使用量很大,我真的想要一个矢量化解决方案,而不是使用 for 循环。

import numpy as np
from sklearn.metrics.pairwise import euclidean_distances

n = 3
sample_size = 5

X = np.random.randint(0, 10, size=(sample_size, n))
Y = np.random.randint(0, 10, size=(sample_size, n))

lst = []

for f in range(0, sample_size):
    ed = euclidean_distances([X[f]], [Y[f]])
    lst.append(ed[0][0])

print(lst)

【问题讨论】:

  • 您指定要使用sklearn 来计算距离。这真的有必要吗?如果是这样,那么我认为你会坚持他们给你的东西。如果没有,那么不清楚按照自己的意愿编写自己的文件会有什么麻烦。欧几里得距离不是一个复杂的函数。
  • 我可能误解了您想要完成的工作,但euclidean_distances(X, Y).diagonal() 没有做您想做的事吗?如果不是,您能否解释一下这与您想要的有何不同?
  • np.sqrt(((X - Y)**2).sum(1))?
  • @Brick 是的,我知道,这是针对在线课程的,因此我假设我们将建立在它的复杂性之上。
  • @Brian:行得通!你可以发布一个答案,我会接受吗?

标签: python numpy scikit-learn


【解决方案1】:

euclidean_distances 计算 X、Y 点的每个组合的距离;这将在内存中变大,如果您只想要每行之间的距离,则完全没有必要。 Sklearn 包含一个名为 paired_distances 的不同函数,它可以满足您的需求:

from sklearn.metrics.pairwise import paired_distances
d = paired_distances(X,Y)
# array([5.83095189, 9.94987437, 7.34846923, 5.47722558, 4.        ])

如果您需要完整的成对距离,您可以从对角线得到相同的结果(如 cmets 中所指出的):

d = euclidean_distances(X,Y).diagonal()

最后:数组是一种 numpy 类型,因此了解 numpy api 本身很有用(可能是 sklearn 在后台调用了什么)。这里有两个例子:

d = np.linalg.norm(X-Y, axis=1)
d = np.sqrt(np.sum((X-Y)**2, axis=1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2011-01-29
    • 2023-03-25
    • 2013-02-12
    • 1970-01-01
    • 2020-09-25
    • 2014-05-31
    • 2016-08-06
    相关资源
    最近更新 更多