我一直在尝试验证我的代码来计算用 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
答案 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。这就是你进入反转功能的原因。