为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Python 中找到两个一维数组之间的马氏距离?

如何在 Python 中找到两个一维数组之间的马氏距离?

婷婷同学_ 2021-08-17 16:22:44
我有两个一维数组,我需要找出它们之间的马氏距离。发现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首先。


如果您得到奇异协方差矩阵,那么您将遇到数学问题,而不是代码问题。问题“为什么我的协方差矩阵是奇异的?”这显然是一个足够普遍的问题。已经被问到并回答了。从广义上讲,在某种意义上,当您的足够多的数据点“太相似”时,似乎就会发生这种情况。我想只使用两个数据点也会使这更有可能。


查看完整回答
反对 回复 2021-08-17
  • 1 回答
  • 0 关注
  • 498 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信