2016-05-03 20 views
0

Ich versuche, den Kosinusabstand zwischen zwei n-dimensionalen Vektoren zu finden. Das habe ich mit Scipy und Sklearn gemacht. Irgendwie sind die Ausgaben der beiden Bibliotheken unterschiedlich. Ich verstehe nicht warum.Cosinus-Ähnlichkeitsausgabe unterschiedlich für verschiedene Bibliotheken

import numpy as np 
from scipy import spatial 
from sklearn import metrics 
a=np.array([1,2,3,4]) 
b=np.array([2,3,1,4]) 
X=np.array([a,b]) 
print spatial.distance.pdist(X,'cosine')[0] 
print metrics.pairwise.cosine_similarity(a,b)[0][0] 
print metrics.pairwise_distances(np.reshape(a,(1,4)),np.reshape(b,(1,4)),metric = 'cosine')[0][0] 

Ausgang dieser Code ist wie folgt:

0.1 

0.9 

0.1 
+1

Ich glaube '0,9' ist der Kosinus des Winkels zwischen' a' und 'b'. –

Antwort

0

Der Unterschied besteht darin, dass ein Druck auf die Kosinus Abstand (spatial.distance.pdist, metrics.pairwise_distances) zu berechnen, während die anderen Zeit Sie Berechnung Cosinus Ähnlichkeit (metrics.pairwise.cosine_similarity).

So cosine_distance = 1 - cosine_similarity, was erklärt, warum die distance zwischen zwei Datenpunkte in Ihrem Beispiel 0.1 ist, und die similarity zwischen den beiden ist 0.9.

scipy berechnet in der Regel Entfernungen, und wenn Sie auf die docs schauen, ist Cosinus Abstand eigentlich als 1 - cosine_similarity dort definiert.

+0

Das macht vollkommen Sinn. Zumindest für dieses Beispiel. Aber ich habe eine Ausgabe größer als 1,0 im Fall von pdist und paarweise Entfernungen. Das hat mich weiter verwirrt. Ich hätte wirklich ein anderes Beispiel geben sollen. –

+0

Können Sie dieses Beispiel angeben? In jedem Fall ist die "Kosinusähnlichkeit" nur im Bereich "[0, 1]" definiert, wenn Ihre Merkmalsvektoren keine negativen Werte enthalten (daher ist der Winkel für Merkmalsvektoren mit nur positiven Werten nicht größer als 90º) . – tttthomasssss

+0

Meine Merkmalsvektoren enthielten negative Werte. Ich habe es nur überprüft. Der pdist war 1.07250622457, während cosine_similarity eine Ausgabe von -0.0725063 ergab. Also habe ich herausgefunden, dass der Bereich, in dem diese beiden Funktionen definiert wurden, einfach anders ist. Sie machen das Gleiche. Vielen Dank. –