Ich muss die Kosinusähnlichkeit zwischen zwei Listen berechnen , sagen wir zum Beispiel Liste 1 dataSetI
und Liste 2 dataSetII
. Ich kann nichts wie Numpy oder ein Statistikmodul verwenden. Ich muss gemeinsame Module (Mathematik usw.) verwenden (und dabei möglichst wenige Module, um den Zeitaufwand zu reduzieren).
Sagen wir dataSetI
ist [3, 45, 7, 2]
und dataSetII
ist [2, 54, 13, 15]
. Die Länge der Listen ist immer gleich.
Natürlich liegt die Kosinusähnlichkeit zwischen 0 und 1 , und aus diesem Grund wird sie mit auf die dritte oder vierte Dezimalstelle gerundet format(round(cosine, 3))
.
Vielen Dank im Voraus für Ihre Hilfe.
python
python-3.x
cosine-similarity
Rob Alsod
quelle
quelle
Antworten:
Sie sollten SciPy ausprobieren . Es gibt eine Reihe nützlicher wissenschaftlicher Routinen, zum Beispiel "Routinen zum numerischen Berechnen von Integralen, Lösen von Differentialgleichungen, Optimieren und spärlichen Matrizen". Es verwendet das superschnell optimierte NumPy für die Zahlenverarbeitung. Siehe hier für die Installation.
Beachten Sie, dass Spatial.Distance.cosine die Entfernung und nicht die Ähnlichkeit berechnet . Sie müssen also den Wert von 1 subtrahieren, um die Ähnlichkeit zu erhalten .
quelle
eine andere Version, die
numpy
nur auf basiertquelle
np.inner(a, b) / (norm(a) * norm(b))
besser zu verstehen.dot
kann das gleiche Ergebnis wieinner
für Vektoren erhalten.scipy.spatial.distance.cosine
.cos_sim = (a @ b.T) / (norm(a)*norm(b))
Sie können mit
cosine_similarity
Funktionsformsklearn.metrics.pairwise
docsquelle
cosine_similarity([[1, 0, -1]], [[-1,-1, 0]])
Ich denke, Leistung ist hier nicht sehr wichtig, aber ich kann nicht widerstehen. Die Funktion zip () kopiert beide Vektoren vollständig neu (eigentlich eher eine Matrixtransponierung), um die Daten in der Reihenfolge "Pythonic" zu erhalten. Es wäre interessant, die Implementierung der Schrauben und Muttern zeitlich zu planen:
Dies geht durch das C-ähnliche Rauschen des einzelnen Extrahierens von Elementen, führt jedoch kein Kopieren von Bulk-Arrays durch und erledigt alles Wichtige in einer einzigen for-Schleife und verwendet eine einzelne Quadratwurzel.
ETA: Der Druckaufruf wurde aktualisiert, um eine Funktion zu sein. (Das Original war Python 2.7, nicht 3.3. Das aktuelle läuft unter Python 2.7 mit a
from __future__ import print_function
Anweisung ausgeführt.) Die Ausgabe ist in beiden Fällen dieselbe.CPYthon 2.7.3 auf 3.0 GHz Core 2 Duo:
Der unpythonische Weg ist in diesem Fall also etwa 3,6-mal schneller.
quelle
cosine_measure
in diesem Fall?cosine_measure
undcosine_similarity
sind einfach verschiedene Implementierungen derselben Berechnung. Entspricht der Skalierung beider Eingabearrays auf "Einheitsvektoren" und der Aufnahme des Punktprodukts.cosine_measure
ist der Code, der früher von pkacprzak gepostet wurde. Dieser Code war eine Alternative zur "anderen" All-Standard-Python-Lösung.Ich habe einen Benchmark basierend auf mehreren Antworten in der Frage durchgeführt und das folgende Snippet wird als die beste Wahl angesehen:
Das Ergebnis überrascht mich, dass die Implementierung
scipy
nicht die schnellste ist. Ich habe ein Profil erstellt und festgestellt, dass Cosinus in Scipy viel Zeit benötigt, um einen Vektor von der Python-Liste in ein Numpy-Array umzuwandeln.quelle
ohne Importe zu verwenden
kann durch ersetzt werden
Ohne Verwendung von numpy.dot () müssen Sie mithilfe des Listenverständnisses eine eigene Punktfunktion erstellen:
und dann ist es nur eine einfache Sache, die Kosinus-Ähnlichkeitsformel anzuwenden:
quelle
Sie können es nach dem Rechnen abrunden:
Wenn Sie es wirklich kurz haben möchten, können Sie diesen Einzeiler verwenden:
quelle
[2,3,2,5]
und v2 versucht[3,2,2,0]
. Es kehrt mit zurück1.0
, als ob sie genau gleich wären. Irgendeine Idee was falsch ist?Sie können dies in Python mit einer einfachen Funktion tun:
quelle
Vergleichen Sie mit numpy eine Liste von Zahlen mit mehreren Listen (Matrix):
quelle
Mit dieser einfachen Funktion können Sie die Kosinusähnlichkeit berechnen:
quelle
Wenn Sie PyTorch bereits verwenden, sollten Sie die CosineSimilarity-Implementierung verwenden .
Angenommen, Sie haben
n
zweidimensionalenumpy.ndarray
s,v1
undv2
ihre Formen sind beide(n,)
. So erhalten Sie ihre Kosinusähnlichkeit:Oder nehmen wir an, Sie haben zwei
numpy.ndarray
sw1
undw2
, deren Formen beide sind(m, n)
. Im Folgenden erhalten Sie eine Liste von Cosinus-Ähnlichkeiten, wobei jede die Cosinus-Ähnlichkeit zwischen einer Zeile inw1
und der entsprechenden Zeile in istw2
:quelle
Alle Antworten eignen sich hervorragend für Situationen, in denen Sie NumPy nicht verwenden können. Wenn Sie können, ist hier ein anderer Ansatz:
Denken Sie auch
EPSILON = 1e-07
daran, die Teilung zu sichern.quelle