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.
4 Réponses :
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:
La distance de corrélation entre u et v, est définie comme
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.
2.220446049250313e-16 # This value is machine dependent
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)
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
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 >
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.