2012-01-14 3 views
5

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

Thanks

ответ

8

Предложением написания собственной весовой нормы L2 является хорошей, но расчет при условии, в this answer неверен. Если намерение состоит в том, чтобы вычислить

enter image description here

, то это должно сделать работу:

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()) 
+0

Это не норма, содержащаяся в этом вопросе - вы квадрат веса. Также '.sum()' полностью избыточно, 'q * q.T' является скалярным произведением вектора с самим собой, т.е. это * есть сумма. – talonmies

+0

Вы правильно относитесь к весам, я должен был быть более осторожным, однако ваша критика о том, что '.sum()' является полностью избыточной, ошибочна. Результатом 'q * q.T' будет матрица 1x1, которая будет неожиданным типом возврата для функции нормы, сумма превратит ее в скаляр. – wim

+0

Но зачем использовать 'sum()' для приведения в скаляр? 'np.asscalar' будет в несколько раз быстрее'? – talonmies

Смежные вопросы