python中的Mahalanabois距离返回矩阵而不是distan

2024-04-24 04:59:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这应该是一个简单的问题,要么我遗漏了信息,要么我错编码了。你知道吗

我试图在python中实现Mahalanabois距离,我遵循python中的公式。你知道吗

我的代码如下:

a = np.array([[1, 3, 5]])
b = np.array([[4, 5, 6]])

X = np.empty((0,3), float)
X = np.vstack([X, [2,3,4]])
X = np.vstack([X, a])
X = np.vstack([X, b])

n = ((a-b).T)*(np.cov(X)**-1)*(a-b)
dist = np.sqrt(n)

dist返回一个3x3数组,但我不应该期望一个表示距离的数字吗?你知道吗

dist = array([[ 1.5       ,  1.73205081,  1.22474487],
       [ 1.73205081       ,  2.        ,  1.41421356],
       [ 1.22474487       ,  1.41421356,  1.        ]])

维基百科并没有(对我)建议它应该返回一个矩阵。在python中搜索mahalanbois距离的实现,我还没有找到可以与之相比的东西。你知道吗


Tags: 代码信息距离编码distnpsqrtfloat
1条回答
网友
1楼 · 发布于 2024-04-24 04:59:14

从wiki page你可以看到,ab是向量,但在你的例子中它们是数组。所以你需要反向转置。还有矩阵乘法。在numpy中,*表示按元素相乘,对于矩阵,应该使用^{}函数或np.array.dot方法。对于您的情况,答案是:

n = (a-b).dot((np.cov(X)**-1).dot((a-b).T))
dist = np.sqrt(n)

In [54]: n
Out[54]: array([[ 25.]])

In [55]: dist
Out[55]: array([[ 5.]])

编辑

正如@roadrunner66注意到的,应该使用逆矩阵而不是元素的逆矩阵。通常np.linalg.inv适用于这种情况,但对于这种情况,您会遇到单一错误,需要使用^{}

n = (a-b).dot((np.linalg.pinv(np.cov(X))).dot((a-b).T))
dist = np.sqrt(n)

In [90]: n
Out[90]: array([[ 1.77777778]])

In [91]: dist
Out[91]: array([[ 1.33333333]])

相关问题 更多 >