马氏距离(Mahalanobis Distance)是一种用于计算不同维度数据点之间距离的度量方法。它考虑了数据的协方差结构,因此在处理具有相关性的多维数据时更加有效。与欧氏距离不同,马氏距离不仅考虑了各个变量的量纲,还考虑了它们之间的相关性。
公式
马氏距离计算两个向量 ( x ) 和 ( y ) 之间的距离,定义为:
D M ( x , y ) = ( x − y ) T S − 1 ( x − y ) \ D_M(x, y) = \sqrt{(x - y)^T S^{-1} (x - y)} \ DM(x,y)=(x−y)TS−1(x−y)
其中:
- ( x ) 和 ( y ) 是两个 n 维向量(数据点)。
- ( S ) 是协方差矩阵(covariance matrix)。
- S − 1 S^{-1} S−1 是协方差矩阵的逆矩阵。
特点
- 尺度无关:马氏距离消除不同维度间量纲的影响。
- 相关性处理:它能处理不同变量之间的相关性,适合高维数据分析。
- 非等距:马氏距离根据数据分布的不同方向具有非等距特性。
使用场景
- 异常检测:用于判断数据点是否属于某一类分布,常用于异常检测。
- 聚类分析:适合用于高维聚类问题。
- 多元正态分布:衡量数据点与均值之间的距离。
与欧氏距离的区别
- 欧氏距离假设各特征相互独立,不考虑变量之间的协方差。
- 马氏距离处理相关性高的数据时比欧氏距离更加精确。
Python 实现
import numpy as np
from scipy.spatial.distance import mahalanobis
# 样本数据
X = np.array([[2, 4, 6], [1, 3, 5], [4, 6, 8]])
# 计算协方差矩阵
cov_matrix = np.cov(X.T)
# 计算协方差矩阵的逆矩阵
inv_cov_matrix = np.linalg.inv(cov_matrix)
# 计算马氏距离
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
dist = mahalanobis(x, y, inv_cov_matrix)
print("马氏距离:", dist)
这个示例中,我们计算样本数据的协方差矩阵及其逆矩阵,之后使用 scipy.spatial.distance.mahalanobis
函数计算两个点之间的马氏距离。