Cosinus-Ähnlichkeitsartikel auf Wikipedia
Können Sie die Vektoren hier (in einer Liste oder so) anzeigen und dann rechnen und uns zeigen lassen, wie es funktioniert?
Ich bin ein Anfänger.
Cosinus-Ähnlichkeitsartikel auf Wikipedia
Können Sie die Vektoren hier (in einer Liste oder so) anzeigen und dann rechnen und uns zeigen lassen, wie es funktioniert?
Ich bin ein Anfänger.
Antworten:
Hier sind zwei sehr kurze Texte zum Vergleich:
Julie loves me more than Linda loves me
Jane likes me more than Julie loves me
Wir wollen wissen, wie ähnlich diese Texte sind, rein in Bezug auf die Anzahl der Wörter (und das Ignorieren der Wortreihenfolge). Wir beginnen mit einer Liste der Wörter aus beiden Texten:
Jetzt zählen wir, wie oft jedes dieser Wörter in jedem Text vorkommt:
Die Wörter selbst interessieren uns allerdings nicht. Wir interessieren uns nur für diese beiden vertikalen Zählvektoren. Zum Beispiel gibt es in jedem Text zwei Instanzen von 'Ich'. Wir werden entscheiden, wie nahe diese beiden Texte beieinander liegen, indem wir eine Funktion dieser beiden Vektoren berechnen, nämlich den Kosinus des Winkels zwischen ihnen.
Die zwei Vektoren sind wieder:
Der Kosinus des Winkels zwischen ihnen beträgt ungefähr 0,822.
Diese Vektoren sind 8-dimensional. Eine Tugend der Verwendung von Kosinusähnlichkeit besteht eindeutig darin, dass eine Frage, die über die menschliche Fähigkeit zur Visualisierung hinausgeht, in eine Frage umgewandelt wird, die möglich ist. In diesem Fall können Sie sich dies als einen Winkel von ungefähr 35 Grad vorstellen, der ein gewisser Abstand von Null oder eine perfekte Übereinstimmung ist.
quelle
Ich vermute, Sie sind mehr daran interessiert, einen Einblick in das " Warum" zu bekommen " der Kosinusähnlichkeit zu erhalten (warum sie einen guten Hinweis auf Ähnlichkeit liefert) als in das " Wie " der Berechnung (die für die Berechnung verwendeten spezifischen Operationen). Wenn Sie sich für Letzteres interessieren, lesen Sie die von Daniel in diesem Beitrag angegebene Referenz sowie eine zugehörige SO-Frage .
Um sowohl das Wie als auch das Warum zu erklären, ist es zunächst sinnvoll, das Problem zu vereinfachen und nur in zwei Dimensionen zu arbeiten. Sobald Sie dies in 2D erhalten haben, ist es einfacher, es in drei Dimensionen zu betrachten, und es ist natürlich schwieriger, es sich in viel mehr Dimensionen vorzustellen, aber bis dahin können wir die lineare Algebra verwenden, um die numerischen Berechnungen durchzuführen und uns auch dabei zu helfen, in Begriffen zu denken von Linien / Vektoren / "Ebenen" / "Kugeln" in n Dimensionen, obwohl wir diese nicht zeichnen können.
So, in zwei Dimensionen : in Bezug auf Text Ähnlichkeit bedeutet dies , dass wir würden konzentrieren sich auf zwei verschiedene Begriffe, sagen die Worte „London“ und „Paris“, und wir würden uns zählen , wie oft jedes dieser Wörter in jeder gefunden die beiden Dokumente, die wir vergleichen möchten. Dies gibt uns für jedes Dokument einen Punkt in der xy-Ebene. Wenn Doc1 beispielsweise einmal Paris und viermal London hätte, würde ein Punkt bei (1,4) dieses Dokument präsentieren (im Hinblick auf diese winzige Bewertung von Dokumenten). Oder in Bezug auf Vektoren wäre dieses Doc1-Dokument ein Pfeil, der vom Ursprung zum Punkt (1,4) führt. Lassen Sie uns vor diesem Hintergrund darüber nachdenken, was es bedeutet, dass zwei Dokumente ähnlich sind und wie sich dies auf die Vektoren bezieht.
SEHR ähnliche Dokumente (wiederum in Bezug auf diesen begrenzten Satz von Dimensionen) hätten die gleiche Anzahl von Verweisen auf Paris UND die gleiche Anzahl von Verweisen auf London, oder vielleicht könnten sie das gleiche Verhältnis dieser Verweise haben. Ein Dokument, Doc2, mit 2 Verweisen auf Paris und 8 Verweisen auf London, wäre ebenfalls sehr ähnlich, nur mit vielleicht einem längeren Text oder einer Art Wiederholung der Städtenamen, aber im gleichen Verhältnis. Vielleicht sind beide Dokumente Leitfäden über London und beziehen sich nur vorübergehend auf Paris (und wie unkühl diese Stadt ist ;-) Nur ein Scherz !!!.
Jetzt können weniger ähnliche Dokumente auch Verweise auf beide Städte enthalten, jedoch in unterschiedlichen Anteilen. Vielleicht würde Doc2 Paris nur einmal und London siebenmal zitieren.
Zurück in unserer xy-Ebene, wenn wir diese hypothetischen Dokumente zeichnen, sehen wir, dass sich ihre Vektoren überlappen (obwohl einige Vektoren länger sein können), wenn sie SEHR ähnlich sind, und da sie weniger gemeinsam haben, beginnen diese Vektoren zu divergieren. einen größeren Winkel zwischen ihnen haben.
Indem wir den Winkel zwischen den Vektoren messen , können wir eine gute Vorstellung von ihrer Ähnlichkeit bekommen , und um die Sache noch einfacher zu machen, indem wir den Kosinus dieses Winkels nehmen, haben wir einen schönen Wert von 0 zu 1 oder -1 zu 1, der anzeigt Diese Ähnlichkeit hängt davon ab, was und wie wir erklären. Je kleiner der Winkel ist, desto größer (näher an 1) ist der Kosinuswert und desto höher ist auch die Ähnlichkeit.
Im Extremfall haben die Dokumente absolut nichts gemeinsam, wenn Doc1 nur Paris und Doc2 nur London zitiert. Doc1 hätte seinen Vektor auf der x-Achse, Doc2 auf der y-Achse, den Winkel 90 Grad, Cosinus 0. In diesem Fall würden wir sagen, dass diese Dokumente orthogonal zueinander sind.
Hinzufügen von Dimensionen :
Mit diesem intuitiven Gefühl für Ähnlichkeit, ausgedrückt als kleiner Winkel (oder großer Kosinus), können wir uns jetzt Dinge in drei Dimensionen vorstellen, indem wir beispielsweise das Wort "Amsterdam" in die Mischung einbringen und ganz gut visualisieren, wie ein Dokument mit zwei Verweise auf jeden haben einen Vektor, der in eine bestimmte Richtung geht, und wir können sehen, wie diese Richtung mit einem Dokument verglichen wird, in dem Paris und London jeweils dreimal zitiert werden, aber nicht Amsterdam usw. Wie gesagt, wir können versuchen, uns diese Phantasie vorzustellen Platz für 10 oder 100 Städte. Es ist schwer zu zeichnen, aber leicht zu konzipieren.
Ich werde zum Schluss nur ein paar Worte über die Formel selbst sagen . Wie ich bereits sagte, liefern andere Referenzen gute Informationen zu den Berechnungen.
Zuerst in zwei Dimensionen. Die Formel für den Kosinus des Winkels zwischen zwei Vektoren wird aus der trigonometrischen Differenz (zwischen Winkel a und Winkel b) abgeleitet:
Diese Formel sieht der Punktproduktformel sehr ähnlich:
Dabei
cos(a)
entspricht derx
Wert undsin(a)
dery
Wert für den ersten Vektor usw. Das einzige Problem besteht darinx
, dassy
usw. nicht genau die Wertecos
undsin
sind, da diese Werte auf dem Einheitskreis gelesen werden müssen. Das ist , wo der Nenner der Formel Tritten in: durch das Produkt aus der Länge dieser Vektoren unterteilt, diex
undy
Koordinaten normalisiert sind.quelle
Hier ist meine Implementierung in C #.
quelle
Der Einfachheit halber reduziere ich die Vektoren a und b:
Dann Kosinusähnlichkeit (Theta):
dann ist die Umkehrung von cos 0,5 60 Grad.
quelle
Dieser Python-Code ist mein schneller und schmutziger Versuch, den Algorithmus zu implementieren:
quelle
Am Beispiel von @Bill Bell gibt es zwei Möglichkeiten, dies in [R] zu tun.
oder die Leistung der crossprod () -Methode nutzen ...
quelle
Dies ist ein einfacher
Python
Code, der die Kosinusähnlichkeit implementiert.quelle
quelle
Einfacher JAVA-Code zur Berechnung der Kosinusähnlichkeit
quelle
Zwei Vektoren A und B existieren in einem 2D-Raum oder 3D-Raum, der Winkel zwischen diesen Vektoren ist cos Ähnlichkeit.
Wenn der Winkel größer ist (maximal 180 Grad erreichen kann), ist dies Cos 180 = -1 und der minimale Winkel ist 0 Grad. cos 0 = 1 impliziert, dass die Vektoren zueinander ausgerichtet sind und daher die Vektoren ähnlich sind.
cos 90 = 0 (was ausreicht, um zu schließen, dass die Vektoren A und B überhaupt nicht ähnlich sind, und da der Abstand nicht negativ sein kann, liegen die Cosinuswerte zwischen 0 und 1. Ein größerer Winkel impliziert daher eine Verringerung der Ähnlichkeit (Visualisierung auch) macht Sinn)
quelle