PCA变换后计算的欧式距离与Mahalanobis距离结果不一致问题
结果不一致的核心原因
你的理论理解没有错误,PCA正交化去相关后,对各主成分做标准差标准化,此时计算的欧氏距离与马氏距离等价,结果不一致是统计量估计的自由度参数不匹配导致的:
np.cov计算协方差矩阵时默认使用无偏估计,除数为样本量减1(你的样本量n=3,除数为2);而np.std计算标准差时默认使用有偏估计,除数为样本量n=3。两者的尺度差了系数sqrt(n/(n-1)) = sqrt(3/2) ≈ 1.2247,刚好对应你两个结果的比值:1.4142 / 1.1547 ≈ 1.2247,完全匹配。- sklearn的PCA默认会自动对输入数据做中心化处理,你得到的
X_transformed已经是减去全局均值后的投影结果,这部分逻辑是正确的。
修正方法
只需要对齐两者的自由度参数即可,比如把标准差计算改为无偏估计,添加ddof=1参数:
import numpy as np from scipy.spatial.distance import mahalanobis from sklearn.decomposition import PCA X = [[1,2], [2,2], [3,3]] mean = np.mean(X, axis=0) cov = np.cov(X, rowvar=False) covI = np.linalg.inv(cov) maha = mahalanobis(X[0], mean, covI) print(maha) # 输出 1.1547005383792515 pca = PCA() X_transformed = pca.fit_transform(X) # 改为无偏估计计算标准差,对齐协方差的自由度参数 stdev = np.std(X_transformed, axis=0, ddof=1) X_transformed /= stdev print(np.linalg.norm(X_transformed[0])) # 输出 1.1547005383792517,和马氏距离一致
内容的提问来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

