我目前正在使用SciPy
来计算欧氏距离
dis = scipy.spatial.distance.euclidean(A,B)
其中; A,B是5维位向量。它现在工作正常,但如果我为每个维度添加权重,那么仍然可以使用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或任何其他有效方式来执行此操作。
由于
答案 0 :(得分:8)
编写自己的加权L2规范的建议很好,但this answer中提供的计算不正确。如果打算计算
然后这应该做的工作:
def weightedL2(a,b,w):
q = a-b
return np.sqrt((w*q*q).sum())
答案 1 :(得分:1)
只需自己定义即可。这样的事情可以解决问题:
def mynorm(A, B, w):
import numpy as np
q = np.matrix(w * (A - B))
return np.sqrt((q * q.T).sum())
答案 2 :(得分: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())