Python中的一维Mahalanobis距离

时间:2012-03-29 23:53:46

标签: python classification

我一直在尝试验证我的代码来计算用 Python 编写的 Mahalanobis距离(并仔细检查以比较OpenCV中的结果) ) 我的数据点各为1维(5行x 1列)。

OpenCV(C ++)中,当数据点的维度具有上述维度时,我成功计算了马哈拉诺比斯距离。

当矩阵的维度为5行x 1列时,以下代码在计算Mahalanobis距离时不成功但是当矩阵中的列数超过1 时它会起作用:

import numpy;
import scipy.spatial.distance;
s = numpy.array([[20],[123],[113],[103],[123]]);
covar = numpy.cov(s, rowvar=0);
invcovar = numpy.linalg.inv(covar)
print scipy.spatial.distance.mahalanobis(s[0],s[1],invcovar);

我收到以下错误:

Traceback (most recent call last):
  File "/home/abc/Desktop/Return.py", line 6, in <module>
    invcovar = numpy.linalg.inv(covar)
  File "/usr/lib/python2.6/dist-packages/numpy/linalg/linalg.py", line 355, in inv
    return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
IndexError: tuple index out of range

2 个答案:

答案 0 :(得分:3)

一维马哈拉诺比斯距离非常容易手动计算:

import numpy as np
s = np.array([[20], [123], [113], [103], [123]])
std = s.std()
print np.abs(s[0] - s[1]) / std

(将the formula减少到一维情况)。

scipy.spatial.distance的问题在于,由于某种原因np.cov在给定一组1d变量时返回标量,即零维数组。你想传入一个二维数组:

>>> covar = np.cov(s, rowvar=0)

>>> covar.shape
()

>>> invcovar = np.linalg.inv(covar.reshape((1,1)))

>>> invcovar.shape
(1, 1)

>>> mahalanobis(s[0], s[1], invcovar)
2.3674720531046645

答案 1 :(得分:0)

协方差需要2个数组进行比较。在np.cov()和Opencv CalcCovarMatrix中,它希望两个数组相互堆叠(使用vstack)。如果在numpy中将Rowvar更改为false或在opencv中使用COVAR_COL,也可以将2个数组并排放置。如果您的数组是多维数组,请先将它们展平()。

因此,如果我想比较两个24x24图像,我将它们平铺成2个1x1024图像,然后将两个图像叠加到2x1024,这是np.cov()的第一个参数。

然后你应该得到一个大的方阵,它显示了将array1中的每个元素与array2中的每个元素进行比较的结果。在我的例子中它将是1024x1024。这就是你进入反转功能的原因。