带权欧几里得距离
我现在正在使用 SciPy
来计算欧几里得距离。
dis = scipy.spatial.distance.euclidean(A,B)
这里的 A 和 B 是五维的比特向量。现在这个方法运行得很好,但如果我给每个维度加上权重,那我还可以继续使用 SciPy 吗?
我现在的计算方式是:sqrt((a1-b1)^2 + (a2-b2)^2 +...+ (a5-b5)^2)
。
我想要的计算方式是:sqrt(w1(a1-b1)^2 + w2(a2-b2)^2 +...+ w5(a5-b5)^2)
,希望能用 SciPy、NumPy 或其他高效的方法来实现。
谢谢!
4 个回答
1
如果你想继续使用scipy这个函数,你可以先这样处理一下这个向量。
def weighted_euclidean(a, b, w):
A = a*np.sqrt(w)
B = b*np.sqrt(w)
return scipy.spatial.distance.euclidean(A, B)
不过这样做看起来比
def weightedL2(a, b, w):
q = a-b
return np.sqrt((w*q*q).sum())
要慢一些。
1
简单来说,你可以自己定义一个。像下面这样就可以了:
def mynorm(A, B, w):
import numpy as np
q = np.matrix(w * (A - B))
return np.sqrt((q * q.T).sum())
11
自己写一个加权的L2范数的建议很好,但在这个回答中提供的计算方法是不正确的。如果你的目的是计算
那么下面的代码可以完成这个任务:
def weightedL2(a,b,w):
q = a-b
return np.sqrt((w*q*q).sum())