2013-06-19 75 views
3

我需要测量两个n维向量之间的距离。看来,马哈拉诺比斯距离是一个很好的选择,所以我想试试看。Mahalanobis距离测量的工作示例

我的代码看起来是这样的:

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的医生说,这VI是协方差矩阵的逆,我觉得np.cov是协方差矩阵,np.linalg.inv是矩阵的逆...

但我看到这里有什么问题(矩阵不是对齐):Matrix VI具有错误的尺寸(2x2而不是13x13)。 所以可行的办法是这样做:

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

但unfortuanly的np.cov(np.vstack((x,y)).T)的DET是0,这意味着,一个逆矩阵不exsists。

那么我怎么能使用马哈拉诺比斯距离测量,当我甚至不能计算协方差矩阵?

回答

1

您没有用于计算协方差的样本集。你可能只需要这里的欧几里得距离(np.linalg.norm(x-y))。你试图达成什么样的大局观?

+0

我目前使用欧几里德距离aka平方差的总和。但我想比较结果与其他距离度量,看看什么最适合我的程序。 – reox

+0

当然,没关系。一些距离度量(欧几里得(ssd是欧几里德平方),L1范数等)可以用于两个任意矢量,但Mahalabonis距离是统计推导的,需要从一组数据点中学习协方差矩阵。欧几里德距离可以被看作是马哈拉博尼斯距离的一个特例,当你没有做或者做不到时(即在没有数据的情况下)任何有关分布x和y的假设可能来自于。你可以使用任意的spd矩阵,但这不会有意义。 – YXD

+0

没问题,所以更好的方法:首先用欧几里得距离找到所有数据点之间的距离,然后通过一些算法进行聚类,例如,基于邻接矩阵,现在我有簇,并且可以用mahalanobis决定新数据点是否属于任何簇? – reox

3

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

+0

当我读到wp时,我看到:为了使用Mahalanobis距离将测试点分类为属于N个类别之一,首先估计每个类别的协方差矩阵,通常基于已知属于每个类别的样本类。然后,给定一个测试样本,计算每个类的Mahalanobis距离,并将测试点归类为Mahalanobis距离最小的类。 所以问题是我需要更多的载体来比较?所以让我说我有他们喜欢x = [a,b,...,n]; a = [0,...,z];那么它会工作? – reox