【发布时间】:2015-02-25 11:37:12
【问题描述】:
我正在寻找计算两个 numpy 数组(x 和 y)之间马氏距离的 NumPy 方法。 以下代码可以使用 Scipy 的 cdist 函数正确计算相同的值。由于这个函数在我的例子中计算了不必要的矩阵,我想要更直接的方法来计算它只使用 NumPy。
import numpy as np
from scipy.spatial.distance import cdist
x = np.array([[[1,2,3,4,5],
[5,6,7,8,5],
[5,6,7,8,5]],
[[11,22,23,24,5],
[25,26,27,28,5],
[5,6,7,8,5]]])
i,j,k = x.shape
xx = x.reshape(i,j*k).T
y = np.array([[[31,32,33,34,5],
[35,36,37,38,5],
[5,6,7,8,5]],
[[41,42,43,44,5],
[45,46,47,48,5],
[5,6,7,8,5]]])
yy = y.reshape(i,j*k).T
results = cdist(xx,yy,'mahalanobis')
results = np.diag(results)
print results
[ 2.28765854 2.75165028 2.75165028 2.75165028 0. 2.75165028
2.75165028 2.75165028 2.75165028 0. 0. 0. 0.
0. 0. ]
我的审判:
VI = np.linalg.inv(np.cov(xx,yy))
print np.sqrt(np.dot(np.dot((xx-yy),VI),(xx-yy).T))
有人能纠正这个方法吗?
这是它的公式:
【问题讨论】:
-
我想计算 [1,11] 和 [31,41] 之间的马氏距离; [2,22] 和 [32,42],...等等。
-
scipy中的实现是纯python代码。您可以将您的方法与他们的方法进行比较。有关两个向量之间马氏距离的计算,请参见此处:github.com/scipy/scipy/blob/… 要计算观察矩阵的距离,您可能必须遍历每个观察向量。 -
是的,我尝试从那个来源进行计算,但是由于我对 Python 的了解很少,它还没有完成。你能看看我的审判吗?
-
您的方法仅与您的辣味不同,包括转置的增量,而辣味源代码不会在第二次出现时转置增量...
-
@jkalden 认为这是一个错误,我在这里提交了报告mail.scipy.org/pipermail/scipy-dev/2014-December/020301.html