5

come esprimere la somiglianza del coseno (http://en.wikipedia.org/wiki/Cosine_similarity)coseno di similitudine, quando uno dei vettori è tutti zeri

quando uno dei vettori è tutti gli zeri?

v1 = [1, 1, 1, 1, 1]

v2 = [0, 0, 0, 0, 0]

Quando si calcola secondo la formula classica otteniamo divisione per zero:

Let d1 = 0 0 0 0 0 0 
Let d2 = 1 1 1 1 1 1 
Cosine Similarity (d1, d2) = dot(d1, d2)/||d1|| ||d2||dot(d1, d2) = (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) + (0)*(1) = 0 

||d1|| = sqrt((0)^2 + (0)^2 + (0)^2 + (0)^2 + (0)^2 + (0)^2) = 0 

||d2|| = sqrt((1)^2 + (1)^2 + (1)^2 + (1)^2 + (1)^2 + (1)^2) = 2.44948974278 

Cosine Similarity (d1, d2) = 0/(0) * (2.44948974278) 
          = 0/0 

Desidero utilizzare questa misura di similarità in un'applicazione di clustering. E spesso ho bisogno di confrontare tali vettori. Anche [0, 0, 0, 0, 0] vs. [0, 0, 0, 0, 0]

Hai qualche esperienza? Poiché si tratta di una misura di somiglianza (non a distanza) dovrei usare il caso speciale per

d ([1, 1, 1, 1]; [0, 0, 0, 0]) = 0

d ([0, 0, 0, 0, 0], [0, 0, 0, 0, 0]) = 1

che dire

d ([1, 1, 1 , 0, 0]; [0, 0, 0, 0, 0]) =? ecc.

risposta

8

Se hai 0 vettori, coseno è la funzione di similitudine sbagliato per la vostra applicazione.

La distanza del coseno è essenzialmente equivalente alla distanza Euclidea quadrata su dati normalizzati L_2. Cioè normalizzi ogni vettore alla lunghezza unitaria 1, quindi calcoli la distanza euclidea quadrata.

L'altro vantaggio di Cosine è rappresentato dalle prestazioni: calcolandolo su dati molto sparsi e ad alta risoluzione è più veloce della distanza euclidea. Trae beneficio dalla scarsità sul quadrato, non solo lineare.

Mentre ovviamente si può provare a modificare la somiglianza con 0 quando esattamente uno è zero e massimo quando sono identici, non risolverà i problemi sottostanti .

Non scegliere la distanza con ciò che si può facilmente calcolare.

Invece, scegliere la distanza in modo che il risultato abbia un che significa sui dati. Se il valore non è definito, non hai un significato ...

A volte, può funzionare per scartare i dati costante-0 come dati privi di significato comunque (ad esempio, analizzando il rumore di Twitter e vedendo un Tweet che è tutti i numeri, senza parole). A volte no.

1

Non è definito.

Pensa di avere un vettore C che non è zero al posto del vettore zero. Moltiplicalo con epsilon> 0 e lascia che epsilon venga eseguito a zero. Il risultato dipenderà da C, quindi la funzione non è continua quando uno dei vettori è zero.