J'ai besoin de mesurer la distance entre deux vecteurs n-diensionnels. Il semble que la distance de Mahalanobis soit un bon choix ici, alors je veux l'essayer.
Mon code ressemble à ceci :
import numpy as np
import scipy.spatial.distance.mahalanobis
x = [19, 8, 0, 0, 2, 1, 0, 0, 18, 0, 1673, 9, 218]
y = [17, 6, 0, 0, 1, 2, 0, 0, 8, 0, 984, 9, 30]
scipy.spatial.distance.mahalanobis(x,y,np.linalg.inv(np.cov(x,y)))
Mais je reçois ce message d'erreur :
/usr/lib/python2.7/dist-packages/scipy/spatial/distance.pyc in mahalanobis(u, v, VI)
498 v = np.asarray(v, order='c')
499 VI = np.asarray(VI, order='c')
--> 500 return np.sqrt(np.dot(np.dot((u-v),VI),(u-v).T).sum())
501
502 def chebyshev(u, v):
ValueError: matrices are not aligned
Le Doc Scipy dit, que VI
est l'inverse de la matrice de covariance, et je pense que np.cov
est la matrice de covariance et np.linalg.inv
est l'inverse d'une matrice...
Mais je vois quel est le problème ici (les matrices ne sont pas alignées) : La matrice VI a la mauvaise dimension (2x2 et non 13x13). La solution possible est donc de faire ceci :
VI = np.linalg.inv(np.cov(np.vstack((x,y)).T))
mais malheureusement, le détachement de np.cov(np.vstack((x,y)).T)
est 0, ce qui signifie qu'il n'existe pas de matrice inverse.
alors comment puis-je utiliser la mesure de la distance de Mahalanobis quand je ne peux même pas calculer la matrice de covariance ?