必须先标准化再调用np.cov(),否则量纲大的特征会主导协方差矩阵,导致主成分方向偏移;标准化需减均值再除标准差(ddof=1),并确保中心化后均值为0、标准差为1。

为什么必须先标准化数据再调用 np.cov()
不标准化直接算协方差矩阵,结果会被量纲大的特征主导。比如一个特征单位是「毫米」,另一个是「万元」,前者数值天然大几个数量级,np.cov() 输出的协方差矩阵就严重失真,主成分方向完全偏移。
标准化要做的只有两步:减均值(X - np.mean(X, axis=0)),再除标准差(/ np.std(X, axis=0, ddof=1))。注意 ddof=1 才符合样本协方差定义,否则 np.cov() 默认用 ddof=0,和 sklearn 的行为不一致。
- 别用
sklearn.preprocessing.StandardScaler后再自己算协方差——它返回的是 ndarray,但内部用了ddof=0,和纯 NumPy 手动实现有细微偏差 - 如果原始数据含缺失值,
np.mean()和np.std()默认会返回nan,得提前用np.nanmean()/np.nanstd()并设axis=0 - 标准化后务必检查:
np.allclose(np.mean(X_std, axis=0), 0)和np.allclose(np.std(X_std, axis=0, ddof=1), 1)应该都为True
手算协方差矩阵后,该用 np.linalg.eig() 还是 np.linalg.svd()
np.linalg.eig() 直接作用于协方差矩阵,返回特征值和特征向量,逻辑清晰;np.linalg.svd() 对中心化后的数据矩阵做奇异值分解,更数值稳定,尤其当特征数远大于样本数时(比如 1000 维、50 个样本),np.cov() 会得到病态矩阵,eig() 可能崩溃或返回复数特征向量。
实际选哪个,看数据形状:
- 若
X_centered.shape[1] (特征数 ≤ 样本数),用 <code>np.linalg.eig(np.cov(X_centered.T))更直观 - 若特征数远大于样本数,改用
U, s, Vt = np.linalg.svd(X_centered, full_matrices=False),主成分就是Vt.T的列,前k列即降维投影矩阵 - 两种方法得到的主成分方向可能符号相反(特征向量可反向),不影响投影结果,但别拿它们直接比对
pca.components_
pca.explained_variance_ratio_ 和手动计算的累计方差比对不上怎么办
这是因为 sklearn 的 explained_variance_ratio_ 默认基于 SVD 的奇异值平方(即特征值)归一化,而手动用 eig() 算出的特征值若没排序、没归一化,或者用了不同自由度的协方差,就会不一致。
要对齐结果,手动计算时必须:
- 对特征值数组
eigvals用np.sort(eigvals)[::-1]降序排列 - 用
eigvals / eigvals.sum()计算比例,不是除以len(eigvals)或其他常数 - 确认协方差矩阵是
np.cov(X_centered.T, ddof=1),不是.T写反或漏掉ddof=1 - 如果用 SVD,奇异值
s要平方再归一:s**2 / np.sum(s**2)
降维投影时,X @ components.T 和 X_centered @ components.T 哪个对
必须用中心化后的数据 X_centered。PCA 的投影本质是把数据点往主成分方向做正交投影,这个操作只对去均值后的坐标有意义。原始 X 没减均值,投影结果整体偏移,后续任何距离、聚类、可视化都会出错。
典型错误写法:X_pca = X @ components.T —— 这相当于在原点未移动的情况下硬投,第一主成分坐标均值不为 0,pca.explained_variance_ 也会虚高。
- 正确流程固定三步:标准化 → 得
X_centered→ 投影:X_pca = X_centered @ components.T - 如果后续要还原(inverse_transform),也必须用同一套均值和标准差,不能只存
components - 用
sklearn时,fit_transform()内部自动完成中心化,但手写时这一步绝不能跳过
手算 PCA 最容易被忽略的,不是公式推导,而是标准化与中心化的数值细节——ddof、nan 处理、矩阵转置方向、投影输入是否已中心化,每一步错一点,结果就漂移。跑通一个 Iris 数据集不难,但在真实业务数据上复现 sklearn 结果,往往卡在这几步。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











