web-dev-qa-db-fra.com

Distance euclidienne vs corrélation de Pearson vs similitude cosinus?

Leurs objectifs sont tous les mêmes: trouver des vecteurs similaires. Lequel utilisez-vous dans quelle situation? (des exemples pratiques?)

44
TIMEX

La corrélation de Pearson et la similitude en cosinus sont invariantes à l'échelle, c'est-à-dire en multipliant tous les éléments par une constante non nulle. La corrélation de Pearson est également invariante pour ajouter une constante à tous les éléments. Par exemple, si vous avez deux vecteurs X1 et X2 et que votre fonction de corrélation Pearson est appelée pearson(), pearson(X1, X2) == pearson(X1, 2 * X2 + 3). C'est une propriété assez importante parce que souvent vous ne vous souciez pas que deux vecteurs soient similaires en termes absolus, seulement qu'ils varient de la même manière.

51
dsimcha

La différence entre le coefficient de corrélation de Pearson et la similitude des cosinus peut être observée à partir de leurs formules:

enter image description here

La raison pour laquelle le coefficient de corrélation de Pearson est invariant à l'ajout d'une constante est que les moyennes sont soustraites par construction. Il est également facile de voir que le coefficient de corrélation de Pearson et la similitude cosinus sont équivalents lorsque X et Y ont des moyens de 0, nous pouvons donc considérer le coefficient de corrélation de Pearson comme une version dégradée de la similitude des cosinus.

Pour une utilisation pratique, considérons les retours des deux actifs x et y:

In [275]: pylab.show()

In [276]: x = np.array([0.1, 0.2, 0.1, -0.1, 0.5])

In [277]: y = x + 0.1

enter image description here

Les rendements de ces actifs ont exactement la même variabilité, qui est mesurée par le coefficient de corrélation de Pearson (1), mais ils ne sont pas exactement similaires, ce qui est mesuré par la similitude en cosinus (0,971).

In [281]: np.corrcoef([x, y])
Out[281]: 
array([[ 1.,  1.],   # The off diagonal are correlations 
       [ 1.,  1.]])  # between x and y

In [282]: from sklearn.metrics.pairwise import cosine_similarity

In [283]: cosine_similarity(x, z)
Out[283]: array([[ 0.97128586]])
28
Akavall

En plus de la réponse de @ dsimcha, les similitudes en cosinus d'un sous-ensemble des données d'origine sont les mêmes que celles des données d'origine, ce qui n'est pas vrai pour la corrélation de Pearson. Cela peut être utile lors du clustering de sous-ensembles de vos données: ils sont (topologiquement) identiques au clustering d'origine, afin qu'ils puissent être plus facilement visualisés et interprétés

2
plijnzaad