我一直试图通过验证我的代码,以计算用Python编写的Mahalanobis距离(并反复检查以比较OpenCV中的结果),我的数据点是每个一维的(5行x1列)。
在OpenCV (C++)中,当数据点的维数具有上述维数时,我成功地计算了Mahalanobis距离。
当矩阵的维数为5行x1列时,计算Mahalanobis距离的代码为unsuccessful。,但当矩阵中的列数超过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发布于 2012-03-30 00:46:52
一维Mahalanobis距离真的很容易手工计算:
import numpy as np
s = np.array([[20], [123], [113], [103], [123]])
std = s.std()
print np.abs(s[0] - s[1]) / std(将公式降为一维情况)。
但是scipy.spatial.distance的问题是,由于某种原因,当给定一组一维变量时,np.cov返回一个标量,即零维数组。您想要传递一个2d数组:
>>> 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发布于 2017-11-19 19:38:38
协方差需要两个数组来比较。在np.cov()和Opencv CalcCovarMatrix中,它都希望将这两个数组叠加在一起(使用v堆栈)。如果在numpy中将Rowvar更改为false,或者在opencv中使用COVAR_COL,也可以将这两个数组并排放在一起。如果您的数组是多维的,那么首先将它们夷为平地。
因此,如果我想比较两个24x24图像,我将它们都压缩为21x1024图像,然后将这两个图像叠加得到一个2x1024,这是np.cov()的第一个参数。
然后,您应该得到一个大的平方矩阵,其中显示了比较array1中的每个元素和array2中的每个元素的结果。在我的示例中,它将是1024x1024。这就是你传递给你的倒置函数的东西。
https://stackoverflow.com/questions/9935271
复制相似问题