You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:45:05