2012-01-14 18 views
5

Attualmente sto usando SciPy per calcolare la distanza euclideadistanza euclidea con pesi

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

dove; A, B sono vettori bit a 5 dimensioni. Funziona bene ora, ma se aggiungo pesi per ogni dimensione, è ancora possibile usare scipy?

Quello che ho adesso: sqrt((a1-b1)^2 + (a2-b2)^2 +...+ (a5-b5)^2)

Quello che voglio: sqrt(w1(a1-b1)^2 + w2(a2-b2)^2 +...+ w5(a5-b5)^2) usando SciPy o NumPy o qualsiasi altro modo efficace per farlo.

Grazie

risposta

8

Il suggerimento di scrivere la propria norma ponderata L2 è una buona, ma il calcolo previsto nel this answer non è corretta. Se l'intenzione è quella di calcolare

enter image description here

allora questo dovrebbe fare il lavoro:

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

Basta definirlo da soli. Qualcosa del genere dovrebbe fare il trucco:

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

Questa non è la norma contenuta nella domanda - avete squadrata i pesi. Anche '.sum()' è completamente ridondante, 'q * q.T' è il prodotto interno del vettore con se stesso, es. è * la * somma. – talonmies

+0

Hai ragione riguardo ai pesi, avrei dovuto essere più attento, tuttavia le tue critiche riguardo al fatto che '.sum()' sia completamente ridondante sono fuorvianti. Il risultato di 'q * q.T' sarebbe una matrice 1x1, che sarebbe un tipo di ritorno inaspettato per una funzione di norma, la somma lo trasformerà in uno scalare. – wim

+0

Ma perché usare 'sum()' per trasmettere su uno scalare? 'np.asscalar' sarà più volte più veloce? – talonmies

Problemi correlati