3 votes

Exemple de travail pour la mesure de la distance de Mahalanobis

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 ?

3voto

Ber Points 10364

Êtes-vous sûr que la distance de Mahalanobis convient à votre application ? D'après Wikipedia vous avez besoin d'un ensemble de points pour générer la matrice de covariance, pas seulement de deux vecteurs. Vous pouvez alors calculer les distances des vecteurs par rapport au centre de l'ensemble.

1voto

Mr E Points 10797

Vous n'avez pas d'échantillon avec lequel calculer une covariance. Vous voulez probablement juste la distance euclidienne ici ( np.linalg.norm(x-y) ). Quelle est la vision d'ensemble de ce que vous essayez d'accomplir ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X