马哈拉诺比斯距离测量的工作实例

时间:2013-06-19 09:35:07

标签: python numpy scipy

我需要测量两个n维向量之间的距离。看来Mahalanobis Distance是一个很好的选择,所以我想尝试一下。

我的代码如下:

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)))

但我收到此错误消息:

/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

Scipy Doc说,VI是协方差矩阵的倒数,我认为np.cov是协方差矩阵,np.linalg.inv是矩阵的逆矩阵... < / p>

但是我看到这里的问题是什么(矩阵没有对齐):Matrix VI的维度是错误的(2x2而不是13x13)。 所以可能的解决方案是这样做:

VI = np.linalg.inv(np.cov(np.vstack((x,y)).T))

但不幸的是np.cov(np.vstack((x,y)).T)的det是0,这意味着逆矩阵不存在。

那么当我甚至无法计算协方差矩阵时,如何使用马哈拉诺比斯距离测量?

2 个答案:

答案 0 :(得分:3)

您确定Mahalanobis Distance适合您的申请吗?根据{{​​3}},您需要一组点来生成协方差矩阵,而不仅仅是两个向量。然后,您可以计算从集合中心开始的向量距离。

答案 1 :(得分:1)

您没有用于计算协方差的样本集。你可能只想要欧几里德距离(np.linalg.norm(x-y))。你想要达到的目标是什么?