d=(x-\mu)^T\Sigma^{-1}(x-\mu)
$ x $ est le vecteur pour lequel vous voulez trouver la distance au groupe de données. $ \ Mu $ est la valeur moyenne du groupe de données. $ \ Sigma ^ {-1} $ est l'inverse de la matrice de covariance du groupe de données. En utilisant la décomposition choleskey, l'équation peut être transformée comme suit.
\begin{eqnarray}
d &=& (x-\mu)^T\Sigma^{-1}(x-\mu) \\
&=& (x-\mu)^T(LL^T)^{-1}(x-\mu) \\
&=& (L^{-1}(x-\mu))^T(L^{-1}(x-\mu)) \\
&=& z^Tz
\end{eqnarray}
$ L $ est la matrice triangulaire inférieure obtenue par la décomposition choleskey.
Si vous définissez
Implémentez ce qui précède en python.
import numpy as np
from scipy.linalg import solve_triangular
def mahalanobis(x, mu, sigma):
L = np.linalg.cholesky(sigma)
d = x - mu
z = solve_triangular(
L, d.T, lower=True, check_finite=False,
overwrite_b=True)
squared_maha = np.sum(z * z, axis=0)
return squared_maha
$ L $ se trouve dans linalg.cholesky de numpy. $ z $ se trouve dans linalg.solve_triangular de scipy.
Recommended Posts