Cosinus Podobieństwo artykuł na Wikipedii
Czy możesz tutaj pokazać wektory (na liście lub coś), a następnie wykonać matematykę i zobaczyć, jak to działa?
Jestem początkujący.
Cosinus Podobieństwo artykuł na Wikipedii
Czy możesz tutaj pokazać wektory (na liście lub coś), a następnie wykonać matematykę i zobaczyć, jak to działa?
Jestem początkujący.
Odpowiedzi:
Oto dwa bardzo krótkie teksty do porównania:
Julie loves me more than Linda loves me
Jane likes me more than Julie loves me
Chcemy wiedzieć, jak podobne są te teksty, wyłącznie pod względem liczby słów (i ignorując ich kolejność). Zaczynamy od sporządzenia listy słów z obu tekstów:
Teraz liczymy, ile razy każde z tych słów pojawia się w każdym tekście:
Jednak nie interesują nas same słowa. Interesują nas tylko te dwa wektory pionowe zliczeń. Na przykład w każdym tekście są dwa wystąpienia „ja”. Zamierzamy zadecydować, jak blisko są te dwa teksty, obliczając jedną funkcję tych dwóch wektorów, mianowicie cosinus kąta między nimi.
Te dwa wektory to znowu:
Cosinus kąta między nimi wynosi około 0,822.
Wektory te są 8-wymiarowe. Zaletą stosowania podobieństwa cosinus jest to, że przekształca pytanie, które jest poza ludzką zdolnością do wizualizacji, na takie, które może być. W tym przypadku można to traktować jako kąt około 35 stopni, co stanowi pewną „odległość” od zera lub idealną zgodność.
źródło
Zgaduję, że jesteś bardziej zainteresowany uzyskaniem wglądu w „ dlaczego ” podobieństwo cosinus działa (dlaczego zapewnia dobrą wskazówkę podobieństwa), a nie „ jak ” jest obliczane (konkretne operacje użyte do obliczeń). Jeśli interesuje Cię to drugie, zapoznaj się z odnośnikiem wskazanym przez Daniela w tym poście, a także związanym z nim pytaniem SO .
Aby wyjaśnić, w jaki sposób, a jeszcze bardziej, dlaczego, na początku przydatne jest uproszczenie problemu i praca tylko w dwóch wymiarach. Po otrzymaniu tego w 2D łatwiej jest myśleć o tym w trzech wymiarach i oczywiście trudniej jest sobie wyobrazić w wielu innych wymiarach, ale do tego czasu możemy użyć algebry liniowej do obliczeń numerycznych, a także pomóc nam myśleć w kategoriach linii / wektorów / „płaszczyzn” / „sfer” w n wymiarach, nawet jeśli nie możemy ich narysować.
Zatem w dwóch wymiarach : w odniesieniu do podobieństwa tekstu oznacza to, że skupilibyśmy się na dwóch odrębnych terminach, wypowiadając słowa „Londyn” i „Paryż”, i policzylibyśmy, ile razy każde z tych słów znajduje się w każdym dwa dokumenty, które chcemy porównać. To daje nam, dla każdego dokumentu, punkt na płaszczyźnie xy. Na przykład, jeśli Doc1 miał kiedyś Paryż, a czterokrotnie Londyn, punkt w punkcie (1,4) przedstawiłby ten dokument (w odniesieniu do tej niewielkiej oceny dokumentów). Lub, mówiąc w kategoriach wektorów, ten dokument Doc1 byłby strzałką przechodzącą od początku do punktu (1,4). Mając na uwadze ten obraz, zastanówmy się, co to znaczy, że dwa dokumenty są podobne i jak to odnosi się do wektorów.
BARDZO podobne dokumenty (ponownie w odniesieniu do tego ograniczonego zestawu wymiarów) miałyby taką samą liczbę odniesień do Paryża ORAZ taką samą liczbę odniesień do Londynu, a może mogłyby mieć taki sam stosunek tych odniesień. Dokument, Doc2, z 2 referencjami do Paryża i 8 referencjami do Londynu, również byłby bardzo podobny, tylko z dłuższym tekstem lub w jakiś sposób bardziej powtarzalnymi nazwami miast, ale w tej samej proporcji. Być może oba dokumenty są przewodnikami po Londynie, tylko mimochodem nawiązując do Paryża (i jak niemiłe jest to miasto ;-) Żartowałem !!!.
Teraz mniej podobne dokumenty mogą również zawierać odniesienia do obu miast, ale w różnych proporcjach. Może Doc2 zacytuje Paryż tylko raz, a Londyn siedem razy.
Wracając do naszej płaszczyzny xy, jeśli narysujemy te hipotetyczne dokumenty, widzimy, że gdy są BARDZO podobne, ich wektory nachodzą na siebie (chociaż niektóre wektory mogą być dłuższe), a ponieważ zaczynają mieć mniej wspólnych, wektory te zaczynają się rozchodzić, mieć między nimi szerszy kąt.
Mierząc kąt między wektorami, możemy uzyskać dobre wyobrażenie o ich podobieństwie , a dla uproszczenia rzeczy, biorąc Cosinus tego kąta, mamy niezłą wartość od 0 do 1 lub od -1 do 1, która wskazuje na to podobieństwo, w zależności od tego, co i jak rozliczamy. Im mniejszy kąt, tym większa (bliższa 1) wartość cosinus, a także wyższe podobieństwo.
Skrajnie, jeśli Doc1 przytacza tylko Paryż, a Doc2 tylko Londyn, dokumenty nie mają absolutnie nic wspólnego. Doc1 miałby wektor na osi x, Doc2 na osi y, kąt 90 stopni, Cosinus 0. W tym przypadku powiedzielibyśmy, że te dokumenty są do siebie prostopadłe.
Dodawanie wymiarów :
Dzięki intuicyjnemu wyczuciu podobieństwa wyrażonemu jako mały kąt (lub duży cosinus) możemy teraz wyobrazić sobie rzeczy w 3 wymiarach, powiedzmy, dodając słowo „Amsterdam” do mieszanki i całkiem dobrze wyobrażając sobie, jak dokument z dwoma odniesienia do każdego z nich miałyby wektor zmierzający w określonym kierunku, i możemy zobaczyć, jak ten kierunek porównałby się z dokumentem trzykrotnie wymieniającym Paryż i Londyn, ale nie Amsterdamem itp. Jak już powiedziano, możemy spróbować wyobrazić sobie tę fantazję miejsce na 10 lub 100 miast. Trudno go narysować, ale jest łatwy do konceptualizacji.
Podsumowując, powiem kilka słów o samej formule . Jak już powiedziałem, inne odniesienia dostarczają dobrych informacji o obliczeniach.
Najpierw w dwóch wymiarach. Wzór na cosinus kąta między dwoma wektorami pochodzi z różnicy trygonometrycznej (między kątem a i kątem b):
Ta formuła wygląda bardzo podobnie do formuły produktu kropkowego:
gdzie
cos(a)
odpowiada nax
wartości isin(a)
nay
wartości dla pierwszego wektora, itp Jedynym problemem jest to, żex
,y
itp nie są dokładniecos
isin
wartości, dla należy czytać na okręgu jednostkowym te wartości. Tam właśnie zaczyna się mianownik formuły: dzieląc przez iloczyn długości tych wektorów, współrzędnex
iy
normalizują się.źródło
Oto moja implementacja w C #.
źródło
Dla uproszczenia redukuję wektor aib:
Następnie podobieństwo cosinus (Theta):
wtedy odwrotność cos 0,5 wynosi 60 stopni.
źródło
Ten kod Pythona to moja szybka i nieprzyzwoita próba zaimplementowania algorytmu:
źródło
Na przykładzie @Bill Bell można to zrobić na dwa sposoby w [R]
lub wykorzystując wydajność metody crossprod () ...
źródło
Jest to prosty
Python
kod, który implementuje podobieństwo cosinus.źródło
źródło
Prosty kod JAVA do obliczania podobieństwa cosinus
źródło
Dwa wektory A i B istnieją w przestrzeni 2D lub przestrzeni 3D, kąt między tymi wektorami jest podobny.
Jeśli kąt jest większy (może osiągnąć maks. 180 stopni), co wynosi Cos 180 = -1, a minimalny kąt wynosi 0 stopni. cos 0 = 1 oznacza, że wektory są wyrównane względem siebie, a zatem wektory są podobne.
cos 90 = 0 (co wystarcza do stwierdzenia, że wektory A i B wcale nie są podobne, a ponieważ odległość nie może być ujemna, wartości cosinus będą wynosić od 0 do 1. W związku z tym większy kąt implikuje zmniejszenie podobieństwa (wizualizacja również to ma sens)
źródło