5

Jak wyrazić podobieństwa cosinus (http://en.wikipedia.org/wiki/Cosine_similarity)Cosinus podobieństwa, gdy jeden z wektorów jest zerami

gdy jeden z wektorów jest zerami?

V1 = [1, 1, 1, 1, 1]

V2 = [0, 0, 0, 0, 0]

podczas obliczania według klasycznym wzorem mamy do podziałów 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 

Chcę użyć tej miary podobieństwa w aplikacji klastrowej. I często będę musiał porównywać takie wektory. Również [0, 0, 0, 0, 0] vs. [0, 0, 0, 0, 0]

Czy masz jakieś doświadczenie? Ponieważ jest to podobieństwo (nie odległość) miara należy użyć specjalnego przypadku dla

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

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

co

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

Odpowiedz

8

Jeśli masz 0 wektorów, cosinus jest źle funkcja podobieństwa do aplikacji.

Odległość cosinus jest zasadniczo równoważna kwadratowej odległości euklidesowej na znormalizowanych danych L_2. To znaczy. znormalizujesz każdy wektor na jednostkę długości 1, a następnie obliczasz kwadratową odległość euklidesową.

Inną zaletą Cosine jest wydajność - obliczanie go na bardzo rzadkich, wielowymiarowych danych jest szybsze niż odległość euklidesowa. Korzysta z rzadkości na placu, a nie tylko liniowo.

Podczas gdy najwyraźniej możesz spróbować zhackować podobieństwo na 0, gdy dokładnie jest zero, a maksymalne, gdy są identyczne, to tak naprawdę nie rozwiąże to problemu leżących u podstaw.

Nie wybieraj odległości według tego, co łatwo obliczyć.

Zamiast tego wybierz odległość, na której wynik ma wartość oznaczającą dla danych. Jeśli wartość jest nieokreślona, ​​nie masz żadnego znaczenia ...

Tak czy inaczej, może i tak odrzucić dane o stałej-0 jako bezsensowne dane (np. Analizując szum Twittera i widząc, że Tweet to wszystkie liczby, brak słów). Czasami tak nie jest.

1

Jest niezdefiniowana.

Pomyśl, że masz wektor C, który nie jest zero w miejscu twój wektor zerowy. Pomnóż go przez epsilon> 0 i pozwól uruchomić epsilon na zero. Wynik będzie zależeć od C, więc funkcja nie jest ciągła, gdy jeden z wektorów jest zerowy.

Powiązane problemy