1. Covariance Geometry & Mahalanobis Distance
Euclidean distance fails in multivariate spaces because it treats all orthogonal axes with equal weight and zero correlation. The Mahalanobis Distance ($D_M$) scales deviations by the inverse covariance matrix $\boldsymbol{\Sigma}^{-1}$:
$$D_M(\mathbf{x}) = \sqrt{ (\mathbf{x} - \boldsymbol{\mu})^T \boldsymbol{\Sigma}^{-1} (\mathbf{x} - \boldsymbol{\mu}) }$$Under multivariate normality $\mathbf{x} \sim \mathcal{N}_d(\boldsymbol{\mu}, \boldsymbol{\Sigma})$, the squared Mahalanobis distance follows a Chi-Squared distribution:
$$D_M^2(\mathbf{x}) \sim \chi_d^2$$2. Multicollinearity & Variance Inflation Factor (VIF)
When regressing predictor $X_j$ against all other predictors $X_{-j}$, let the coefficient of determination be $R_j^2$. The Variance Inflation Factor (VIF) quantifies variance expansion due to collinearity:
$$\text{VIF}_j = \frac{1}{1 - R_j^2}$$$$\text{Var}(\hat{\beta}_j) = \sigma^2 \cdot \frac{\text{VIF}_j}{\sum_{i=1}^n (X_{ij} - \bar{X}_j)^2}$$A threshold of $\text{VIF}_j > 10$ ($R_j^2 > 0.90$) signals pathological multicollinearity requiring regularization or feature removal.
3. Python Verification: Exact Mahalanobis Distance Outlier Scoring
import numpy as np
from scipy.stats import chi2
class MultivariateOutlierDetector:
"""Rigorous Mahalanobis distance outlier scorer with Chi-Squared p-value thresholding."""
def __init__(self, data: np.ndarray):
self.mu = np.mean(data, axis=0)
self.cov = np.cov(data, rowvar=False)
self.inv_cov = np.linalg.pinv(self.cov)
self.dim = data.shape[1]
def compute_distances(self, X: np.ndarray) -> np.ndarray:
diff = X - self.mu
# Compute quadratic form (x - mu)^T * Sigma^-1 * (x - mu)
left = np.dot(diff, self.inv_cov)
sq_dist = np.sum(left * diff, axis=1)
return np.sqrt(sq_dist)
def detect_outliers(self, X: np.ndarray, alpha: float = 0.01) -> np.ndarray:
distances = self.compute_distances(X)
threshold_sq = chi2.ppf(1.0 - alpha, df=self.dim)
return distances ** 2 > threshold_sq
if __name__ == "__main__":
np.random.seed(42)
# 2D correlated bivariate normal sample
mean = [0, 0]
cov = [[2.0, 1.6], [1.6, 2.0]]
X_normal = np.random.multivariate_normal(mean, cov, size=500)
detector = MultivariateOutlierDetector(X_normal)
# Test point at (-3, 3) -> Euclidean distance is moderate, but against correlation it's an extreme outlier!
test_pts = np.array([[0.0, 0.0], [2.0, 2.0], [-3.0, 3.0]])
dists = detector.compute_distances(test_pts)
outliers = detector.detect_outliers(test_pts, alpha=0.001)
for pt, d, out in zip(test_pts, dists, outliers):
print(f"Point {pt} -> Mahalanobis Distance: {d:.2f} | Outlier Flag (alpha=0.001): {out}")