首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的一维Mahalanobis距离

Python中的一维Mahalanobis距离
EN

Stack Overflow用户
提问于 2012-03-29 23:53:46
回答 2查看 8.7K关注 0票数 6

我一直试图通过验证我的代码,以计算用Python编写的Mahalanobis距离(并反复检查以比较OpenCV中的结果),我的数据点是每个一维的(5行x1列)。

在OpenCV (C++)中,当数据点的维数具有上述维数时,我成功地计算了Mahalanobis距离。

当矩阵的维数为5行x1列时,计算Mahalanobis距离的代码为unsuccessful。,但当矩阵中的列数超过1时,它才能工作。

代码语言:javascript
复制
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);

我得到以下错误:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-30 00:46:52

一维Mahalanobis距离真的很容易手工计算:

代码语言:javascript
复制
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数组:

代码语言:javascript
复制
>>> 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
票数 5
EN

Stack Overflow用户

发布于 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。这就是你传递给你的倒置函数的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9935271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档