# Python返回数组中的平方Mahalanobis距离函数 - 为什么？

##### 问题描述投票：1回答：2

``````import numpy as np
def Mahalanobis(x, covariance_matrix, mean):
x = np.array(x)
mean = np.array(mean)
covariance_matrix = np.array(covariance_matrix)
return (x-mean)*np.linalg.inv(covariance_matrix)*(x.transpose()-mean.transpose())

#variables x and mean are 1xd arrays; covariance_matrix is a dxd matrix
#the 1xd array passed to x should be multiplied by the (inverted) dxd array
#that was passed into the second argument
#the resulting 1xd matrix is to be multiplied by a dx1 matrix, the transpose of
#[x-mean], which should result in a 1x1 array (a number)
``````

``````Mahalanobis([2,5], [[.5,0],[0,2]], [3,6])
``````

``````out[]: array([[ 2. ,  0. ],
[ 0. ,  0.5]])
``````

python numpy scipy statistics mahalanobis
##### 2个回答
0

``````import numpy as np
def Mahalanobis(x, covariance_matrix, mean):

x = np.array(x)
mean = np.array(mean)
covariance_matrix = np.array(covariance_matrix)

t1 = (x-mean)
print(f'Term 1 {t1}')

icov = np.linalg.inv(covariance_matrix)
print(f'Inverse covariance {icov}')

t2 = (x.transpose()-mean.transpose())
print(f'Term 2 {t2}')

mahal = t1.dot(icov.dot(t2))

#return (x-mean)*np.linalg.inv(covariance_matrix).dot(x.transpose()-mean.transpose())
return mahal

#variables x and mean are 1xd arrays; covariance_matrix is a dxd matrix
#the 1xd array passed to x should be multiplied by the (inverted) dxd array
#that was passed into the second argument
#the resulting 1xd matrix is to be multiplied by a dx1 matrix, the transpose of
#[x-mean], which should result in a 1x1 array (a number)

Mahalanobis([2,5], [[.5,0],[0,2]], [3,6])
``````

``````Term 1 [-1 -1]
Inverse covariance [[2.  0. ]
[0.  0.5]]
Term 2 [-1 -1]
Out[9]:    2.5
``````

0

``````import scipy.spatial, numpy as np

scipy.spatial.distance.mahalanobis([2,5], [3,6], np.linalg.inv([[.5,0],[0,2]]))
# 1.5811388300841898
1.5811388300841898**2 # squared Mahalanobis distance
# 2.5000000000000004

def Mahalanobis(x, covariance_matrix, mean):
x, m, C = np.array(x), np.array(mean), np.array(covariance_matrix)
return (x-m)@np.linalg.inv(C)@(x-m).T

Mahalanobis([2,5], [[.5,0],[0,2]], [3,6])
# 2.5

np.isclose(
scipy.spatial.distance.mahalanobis([2,5], [3,6], np.linalg.inv([[.5,0],[0,2]]))**2,
Mahalanobis([2,5], [[.5,0],[0,2]], [3,6])
)
# True
``````