我需要测量两个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。
那么我怎么能使用马哈拉诺比斯距离测量,当我甚至不能计算协方差矩阵?
我目前使用欧几里德距离aka平方差的总和。但我想比较结果与其他距离度量,看看什么最适合我的程序。 – reox
当然,没关系。一些距离度量(欧几里得(ssd是欧几里德平方),L1范数等)可以用于两个任意矢量,但Mahalabonis距离是统计推导的,需要从一组数据点中学习协方差矩阵。欧几里德距离可以被看作是马哈拉博尼斯距离的一个特例,当你没有做或者做不到时(即在没有数据的情况下)任何有关分布x和y的假设可能来自于。你可以使用任意的spd矩阵,但这不会有意义。 – YXD
没问题,所以更好的方法:首先用欧几里得距离找到所有数据点之间的距离,然后通过一些算法进行聚类,例如,基于邻接矩阵,现在我有簇,并且可以用mahalanobis决定新数据点是否属于任何簇? – reox