Python中的一维马氏距离

gar*_*rak 5 python classification

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

OpenCV(C ++)中,当数据点的尺寸具有上述尺寸时,我成功地计算了马氏距离。

当矩阵的尺寸为5行x 1列时,以下代码无法成功计算马氏距离。但是,当矩阵中的列数大于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);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

Dou*_*gal 5

一维马氏距离很容易手动计算:

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

(将公式简化为一维情况)。

但问题scipy.spatial.distance是,由于某种原因np.cov,当给定一组一维变量时,会返回一个标量,即零维数组。您想传入一个二维数组:

>>> 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
Run Code Online (Sandbox Code Playgroud)