我有两个一维数组,我需要找出它们之间的马氏距离。发现Scipy已经实现了这个功能。但是,我对 IV 的值应该是什么感到困惑。我尝试执行以下操作V = np.cov(np.array([array_1, array_2]))IV = np.linalg.inv(V)print(mahalanobis(array_1, array_2, IV))但是,我收到以下错误:文件“C:\Users\XXXXXX\AppData\Local\Continuum\anaconda3\envs\face\lib\site-packages\scipy\spatial\distance.py”,第 1043 行,在 mahalanobis m = np.dot(np.dot (三角洲,VI),三角洲)ValueError: 形状 (128,) 和 (2,2) 未对齐:128 (dim 0) != 2 (dim 0)
1 回答
陪伴而非守候
TA贡献1757条经验 获得超8个赞
从numpy.covdocs,第一个参数应该是一个数组,m这样:
m 的每一行代表一个变量,每一列代表所有这些变量的一个观察值。
因此,要修复您的代码,只需.T在调用之前对数组进行转置(with )cov:
V = np.cov(np.array([array_1, array_2]).T)
IV = np.linalg.inv(V)
print(mahalanobis(array_1, array_2, IV))
我刚刚在一些随机数据上测试了这一点,我可以确认它有效。
此外,仅从两个观测值计算协方差是一个坏主意,而且不太可能非常准确。如果您的数据来自图像,则img在计算协方差矩阵时应使用整个图像(或至少整个感兴趣区域),然后使用该矩阵来查找两个感兴趣向量之间的马氏距离:
V = np.cov(np.array(img))
IV = np.linalg.inv(V)
print(mahalanobis(array_1, array_2, IV))
您可能需要也可能不需要替换img为img.T,这取决于您的生成方式array_1和array_2首先。
如果您得到奇异协方差矩阵,那么您将遇到数学问题,而不是代码问题。问题“为什么我的协方差矩阵是奇异的?”这显然是一个足够普遍的问题。已经被问到并回答了。从广义上讲,在某种意义上,当您的足够多的数据点“太相似”时,似乎就会发生这种情况。我想只使用两个数据点也会使这更有可能。
添加回答
举报
0/150
提交
取消