Euclidean distance with weights

Question:

I am currently using `SciPy` to calculate the euclidean distance

``````dis = scipy.spatial.distance.euclidean(A,B)
``````

where; A, B are 5-dimension bit vectors. It works fine now, but if I add weights for each dimension then, is it still possible to use scipy?

What I have now: `sqrt((a1-b1)^2 + (a2-b2)^2 +...+ (a5-b5)^2)`

What I want: `sqrt(w1(a1-b1)^2 + w2(a2-b2)^2 +...+ w5(a5-b5)^2)` using scipy or numpy or any other efficient way to do this.

Thanks

Simply define it yourself. Something like this should do the trick:

``````def mynorm(A, B, w):
import numpy as np
q = np.matrix(w * (A - B))
return np.sqrt((q * q.T).sum())
``````

The suggestion of writing your own weighted L2 norm is a good one, but the calculation provided in this answer is incorrect. If the intention is to calculate

then this should do the job:

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

If you want to keep using scipy function you could pre-process the vector like this.

``````def weighted_euclidean(a, b, w):
A = a*np.sqrt(w)
B = b*np.sqrt(w)
return scipy.spatial.distance.euclidean(A, B)
``````

However it’s look slower than

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

The present version of scipy (v1.9.3 as of writing) supports weighted L2 distance. From scipy.spatial.distance.euclidean

where: w(N,) array_like, optional

The weights for each value in u and v. Default is None, which gives each value a weight of 1.0

Categories: questions
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.