2
votes

Que fait les paires_distances de sklearn avec metric = 'correlation'?

J'ai mis différentes valeurs dans cette fonction et observé la sortie. Mais je ne trouve pas de modèle prévisible dans ce qui est généré.

Ensuite, j'ai essayé de fouiller dans fonction elle-même, mais c'est déroutant car elle peut faire un certain nombre de calculs différents.

Selon la Docs :

XXX

Je vois qu'il renvoie une matrice de hauteur et de largeur égale au nombre de listes imbriquées entrées, ce qui implique qu'il compare chacune d'elles.

Mais sinon, j'ai du mal à comprendre ce qu'il fait et d'où viennent les valeurs.

Exemples que j'ai essayés: p>

# Scipy
import scipy
scipy.spatial.distance.correlation([1,2], [1,2])
>>> 0.0

# Sklearn
pairwise_distances([[1,2], [1,2]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>        [2.22044605e-16, 0.00000000e+00]])

Calcul de la distance de corrélation avec Scipy

Je ne comprends pas où le sklearn 2.22044605e-16 code > la valeur provient de si scipy renvoie 0.0 pour les mêmes entrées.

pairwise_distances([[1]], metric='correlation')
>>> array([[0.]])

pairwise_distances([[1], [1]], metric='correlation')
>>> array([[ 0., nan],
>>>        [nan,  0.]])

# returns same as last input although input values differ
pairwise_distances([[1], [2]], metric='correlation')
>>> array([[ 0., nan],
>>>        [nan,  0.]])

pairwise_distances([[1,2], [1,2]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>        [2.22044605e-16, 0.00000000e+00]])

# returns same as last input although input values differ
# I incorrectly expected more distance because input values differ more
pairwise_distances([[1,2], [1,3]], metric='correlation')
>>> array([[0.00000000e+00, 2.22044605e-16],
>>>       [2.22044605e-16, 0.00000000e+00]])

Je ne cherche pas une explication de haut niveau mais un exemple de comment les nombres sont calculés.


1 commentaires

comme d'autres l'ont déclaré 2.22e-16 est 0 pour tous les usages intensifs car les flottants en python ne sont pas plus précis que cela.


4 Réponses :


1
votes

Les mesures de distance peuvent être trouvées ici: https://docs.scipy.org/doc/scipy/reference/ spatial.distance.html

Et la corrélation est spécifiquement ici:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.correlation.html#scipy.spatial.distance.correlation

La distance de corrélation entre u et v, est définie comme

 entrez la description de l'image ici


1 commentaires

Merci. J'ai ajouté une partie sur l'essai de scipy.spatial.distance.correlation () . Obtenir des valeurs différentes de celles de sklearn, donc je pense toujours qu'il me manque quelque chose de majeur.



1
votes
2.220446049250313e-16                                    # This value is machine dependent

0 commentaires

1
votes

pairwise_distances appelle en interne distance.pdist () , lorsque y vaut None (ce qui signifie que nous voulons pour calculer la matrice de distance pour chaque vecteur dans X)

Référence 1 , 2

La mise en œuvre serait similaire à la suivante:

u, v = np.array([1,2]), np.array([1,2])

umu = np.average(u)
vmu = np.average(v)
u = u - umu
v = v - vmu
uv = np.average(u * v)
uu = np.average(np.square(u))
vv = np.average(np.square(v))
dist = 1.0 - uv / np.sqrt(uu * vv)
dist

#0

Mais scipy.spatial.distance.correlation l'implémentation diffère dans la dernière version

dernière version , ancienne version

Si nous définissons les pondérations sur Aucun, l'extrait suivant en est la version simplifiée:

XXX


0 commentaires

1
votes

Je comprends tout à fait la confusion.

La corrélation est calculée sur des vecteurs, et sklearn a effectué une conversion non triviale d'un scalaire en un vecteur de taille 1.

le résultat de

M[0,0] = correlation(u,u)
M[0,1] = correlation(u,v)
M[0,2] = correlation(u,w)
M[1,0] = correlation(v,u)
M[1,1] = correlation(v,v)
M[1,2] = correlation(v,w)
M[2,0] = correlation(w,u)
M[2,1] = correlation(w,v)
M[2,2] = correlation(w,w)

Est une matrice M de forme (len ([u, v, w]), len ([u, v, w])) = (3,3) , où:

from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import correlation
pairwise_distances([u,v,w], metric='correlation')

vous étiez à la recherche de corrélation ([u, v, w], [u, v, w]) qui a une valeur valide uniquement si u , v et w sont des scalaires.

p >


0 commentaires