Евклидово расстояние с весами

В настоящее время я использую 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 или любого другого эффективного способа сделать это.

Спасибо


person Maggie    schedule 14.01.2012    source источник


Ответы (3)


Предложение написать собственную взвешенную норму L2 - хорошее предложение, но расчет, приведенный в этом ответе, неверен. Если намерение состоит в том, чтобы вычислить

введите описание изображения здесь

тогда это должно сработать:

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

Просто определите это сами. Что-то вроде этого должно помочь:

def mynorm(A, B, w):
    import numpy as np
    q = np.matrix(w * (A - B))
    return np.sqrt((q * q.T).sum())
person wim    schedule 14.01.2012
comment
Это не норма, содержащаяся в вопросе - вы возложили веса в квадрат. Также .sum() полностью избыточен, q*q.T является внутренним произведением вектора на себя, т.е. это это сумма. - person talonmies; 14.01.2012
comment
Вы правы насчет веса, мне следовало быть более осторожным, однако ваша критика по поводу полной избыточности .sum() ошибочна. Результатом q * q.T будет матрица 1x1, которая будет неожиданным возвращаемым типом для функции нормы, сумма превратит ее в скаляр. - person wim; 14.01.2012
comment
Но зачем использовать sum() для преобразования в скаляр? np.asscalar будет в несколько раз быстрее`? - person talonmies; 14.01.2012
comment
Я не знаю причины, но именно так это реализовано в scipy.spatial.distance.euclidean .. Я просто предполагаю, что авторы scipy знают, что лучше - person wim; 14.01.2012

Если вы хотите продолжать использовать функцию 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())
person ucsky    schedule 27.11.2019