问题描述
import numpy as np
from scipy.spatial import distance
d1 = np.random.randint(0, 255, size=(50))*0.9
d2 = np.random.randint(0, 255, size=(50))*0.7
vi = np.linalg.inv(np.cov(d1,d2, rowvar=0))
res = distance.mahalanobis(d1,d2,vi)
print res
ValueError:形状(50,)和(2,2)不对齐:50(dim 0)!= 2(dim 0)
1楼
参考D x D协方差矩阵来计算两个D维向量之间的距离,从某种意义上说,该矩阵“定义了计算距离的空间”。 矩阵编码在计算距离时应如何加权各种坐标组合。
看来您已经为您的点计算了2x2样本协方差,这不是在马哈拉诺比斯距离中使用的正确类型的协方差矩阵。
如果你不已经有一个良好的理由的50x50协方差矩阵定义你的马氏指标,马氏距离可能是不适合你的应用程序的正确选择。 没有更多细节,很难给出更好的建议。
2楼
如的答案所述,协方差逆矩阵必须为DxD维,其中D为向量中元素的数量。 因此,您的代码应为:
import numpy as np
from scipy.spatial import distance
d1 = np.random.randint(0, 255, size=(50))*0.9
d2 = np.random.randint(0, 255, size=(50))*0.7
m =zip(d1, d2)
v = np.cov(m)
try:
vi = np.linalg.inv(v)
except:
vi = np.linalg.pinv(v) #just in case the produced matrix cannot be inverted
res = distance.mahalanobis(d1,d2,vi)
print res