Es ist eine klassische Frage, aber ich glaube, dass viele Menschen immer noch nach Antworten suchen. Diese Frage ist eine andere als this one, da meine Frage ist die Operation zwischen zwei sparse Vektoren (keine Matrix).Faster Python Kosinus Unähnlichkeit zwischen Scipy CSR "Vektoren"
Ich schrieb eine blog post darüber, wie Kosinus Scipy Spatial Distance (SSD) wird langsamer, wenn die Dimension der Daten wird immer höher (weil es auf dichten Vektoren funktioniert). Der Beitrag ist in indonesischer Sprache, aber der Code, meine Experimenteinstellungen & Ergebnisse sollten unabhängig von der Sprache leicht verständlich sein (am Ende des Beitrags).
Derzeit ist diese Lösung mehr als 70-mal schneller für hohe Dimensionsdaten (im Vergleich zu SSD) & mehr Speicher effizient:
import numpy as np
def fCosine(u,v): # u,v CSR vectors, Cosine Dissimilarity
uData = u.data; vData = v.data
denominator = np.sqrt(np.sum(uData**2)) * np.sqrt(np.sum(vData**2))
if denominator>0:
uCol = u.indices; vCol = v.indices # np array
intersection = set(np.intersect1d(uCol,vCol))
uI = np.array([u1 for i,u1 in enumerate(uData) if uCol[i] in intersection])
vI = np.array([v2 for j,v2 in enumerate(vData) if vCol[j] in intersection])
return 1-np.dot(uI,vI)/denominator
else:
return float("inf")
Ist es möglich, diese Funktion (Pythonic oder über JIT/Cython noch weiter zu verbessern ???). Hier
Awesome, thanks so much ... Ich frage mich, warum math.sqrt schneller als numpy.sqrt ist? Ist im Allgemeinen Mathe schneller für einfache Domäne (Skalare/Liste)? – taufikedys
Ja, 'math.sqrt' ist schneller für Skalare. Ich vermute, dass dies auch für alle Funktionen im Modul "math" gilt, da sie anders als die entsprechenden NumPy-Funktionen keine alternativen Codepfade testen müssen (wenn Array dies tut, wenn iterierbar, usw.). – unutbu