代码是:
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]])
似乎我的函数只是给了我在第二个参数中输入的2x2矩阵的逆。
答案 0 :(得分:0)
你犯了一个经典错误,即假设*运算符正在进行矩阵乘法。在Python / numpy中并非如此(请参阅http://www.scipy-lectures.org/intro/numpy/operations.html和https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html)。我将其分解为中间步骤并使用点函数
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
答案 1 :(得分:0)
一个人可以使用scipy
的{{1}}函数进行验证:
mahalanobis()