2016-06-20 21 views
0

ich eine numpy Matrix haben sagen A wie untenBerechnung Kosinusähnlichkeit von Spalten einer Python-Matrix

array([[1, 2, 3], 
     [1, 2, 2]]) 

ich die Kosinusähnlichkeit Matrix dieser Matrix finden wollen, wo Cosinus Ähnlichkeit zwischen den Spalten ist.

Jetzt Cosinus Ähnlichkeit zweier Vektoren ist nur ein Punktprodukt von zwei von der Norm Produkt L2 normalisiert jeder von

Aber ich will nicht für jede Spalte in einer Schleife zu durchlaufen und es tun.

Also versuchte ich zuerst diese:

from scipy.spatial import distance 
cos=distance.cdist(a.T,a.T,'cosine') 

Hier habe ich es als sonst transponieren nehme täte Cosinus von Reihen (Beobachtungen). Ich möchte für Spalten.

Allerdings bin ich mir nicht sicher, dass dies die richtige Antwort ist. Das Dokument dieser Funktion sagt, dass es 1 - cosine_similarity gibt. Also sollte ich das dann tun?

cos-1-distance.cdist(a.T,a.T,'cosine') 

Bitte beraten.

II)

auch was, wenn ich versuche so etwas wie dies zu tun:

cos=(np.dot(a.T,a))/(np.linalg.norm(a, axis=0, keepdims=True))*(np.linalg.norm(a, axis=0, keepdims=True)) 

Es wird nicht wie einige Problem umgehen die richtige L2-Norm der rechten Spalte zu bekommen. Irgendeine Idee, wie wir das ohne Funktion umsetzen können?

Antwort

1

Try this:

a = np.array([[1, 2, 3], [1, 2, 2]]) 
n = np.linalg.norm(a, axis=0).reshape(1, a.shape[1]) 
a.T.dot(a)/n.T.dot(n) 

array([[ 1.  , 1.  , 0.98058068], 
     [ 1.  , 1.  , 0.98058068], 
     [ 0.98058068, 0.98058068, 1.  ]]) 

Diese Zuordnung für n hätte arbeitete.

np.linalg.norm(a, axis=0)[None, :] 
Verwandte Themen