马氏距离是考虑数据分布特性的距离度量,通过协方差矩阵捕捉特征间相关性。
定义
与欧氏距离的对比
| 特性 | 马氏距离 | 欧氏距离 |
|---|---|---|
| 尺度不变性 | 有 | 无 |
| 相关性考虑 | 有 | 无 |
| 分布感知 | 有 | 无 |
几何解释
相当于先通过 线性变换使数据协方差矩阵为单位矩阵,再计算欧氏距离。
应用场景
| 场景 | 说明 |
|---|---|
| 异常检测 | 识别偏离整体分布的样本 |
| 分类算法 | Fisher线性判别分析 |
| 聚类分析 | 考虑特征相关性的聚类 |
Python 实现
import numpy as np
from scipy.linalg import inv
def mahalanobis_distance(x, mu, sigma):
diff = x - mu
return np.sqrt(diff.T @ inv(sigma) @ diff)
# 示例
data = np.random.multivariate_normal(mean=[0,0], cov=[[1,0.5],[0.5,1]], size=100)
mu = np.mean(data, axis=0)
sigma = np.cov(data, rowvar=False)
distance = mahalanobis_distance(data[0], mu, sigma)实践技巧
| 问题 | 解决方案 |
|---|---|
| 小样本 | 收缩估计或正则化 |
| 数值不稳定 | 检查协方差矩阵条件数 |
| 高维问题 | 降维或稀疏估计 |