带权欧几里得距离

9 投票
4 回答
10305 浏览
提问于 2025-04-17 10:14

我现在正在使用 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范数的建议很好,但在这个回答中提供的计算方法是不正确的。如果你的目的是计算

enter image description here

那么下面的代码可以完成这个任务:

def weightedL2(a,b,w):
    q = a-b
    return np.sqrt((w*q*q).sum())

撰写回答