主成分分析 PCA
PCA 的全称是 Principal Component Analysis,即主成分分析。它是一种常用的无监督降维方法,核心思想是:
在尽量保留数据方差信息的前提下,把高维数据投影到低维空间。
例如原始数据有
PCA 常用于数据可视化、特征压缩、去噪、预处理等任务。
1. 样本矩阵
设一个随机变量有
样本集合有
那么就形成了
对每一列求均值,第
进行样本中心化,每一列的值减去该列的平均值,得到新矩阵:
后续推导默认使用中心化后的样本矩阵
2. 协方差矩阵
协方差计算公式为:
对于
协方差矩阵的每个值
把协方差公式展开后,提出公共的
由于此时样本已经中心化,
整个矩阵可以最终化简得到:
协方差矩阵大小为:
也就是说,协方差矩阵描述的是特征维度之间的相关性。
3. 第一主成分
求第一主成分 PC1 的问题可以转化为:寻找一个单位方向向量
约束条件为:
第
其中
所有样本投影后的方差为:
写成矩阵形式:
因此:
所以 PCA 的第一主成分方向可以写成优化问题:
4. 求极大值问题
最终将问题转变为已知条件下的最大值问题,可以利用拉格朗日乘数法求解:
构造拉格朗日函数:
对函数求偏导:
最后就得到了:
这说明,
把上式带入目标函数:
最大化目标函数就等价于最大化特征值
因此:
第一主成分方向就是协方差矩阵最大特征值对应的特征向量。
5. 多个主成分
如果需要降到
设这些特征向量组成矩阵:
则原始数据的低维表示为:
其中:
如果想从低维空间近似重构原始数据,可以使用:
因为
当
6. 解释方差比
每个特征值
如果特征值从大到小排列为:
那么第
前
如果
7. PCA 与 SVD 的关系
PCA 也可以通过奇异值分解实现。对中心化矩阵
则协方差矩阵为:
代入 SVD:
因此,
对应的特征值为:
其中
实际机器学习库中,PCA 常常通过 SVD 计算,而不是显式构造协方差矩阵。这在高维数据上更加稳定。
8. PCA 的基本步骤
PCA 的完整流程可以总结为:
- 对样本矩阵按列中心化。
- 计算协方差矩阵
。 - 对
做特征值分解。 - 选择最大前
个特征值对应的特征向量。 - 将原始数据投影到这些方向上:
在实际使用中,还经常先对特征做标准化:
如果不同特征量纲差异很大,例如身高、收入、年龄混在一起,标准化通常是必要的。
9. sklearn 案例代码
下面用鸢尾花数据集演示 PCA。原始数据有 4 个特征,我们将其降到 2 维,方便可视化。
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
iris = load_iris()
X = iris.data
y = iris.target
# PCA 对量纲敏感,通常先标准化
X_scaled = StandardScaler().fit_transform(X)
# 降到二维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print("降维前形状:", X.shape)
print("降维后形状:", X_pca.shape)
print("解释方差比:", pca.explained_variance_ratio_)
print("累计解释方差比:", pca.explained_variance_ratio_.sum())
plt.figure(figsize=(6, 5))
for label in set(y):
plt.scatter(
X_pca[y == label, 0],
X_pca[y == label, 1],
label=iris.target_names[label],
alpha=0.8,
)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("Iris PCA")
plt.legend()
plt.tight_layout()
plt.show()如果只想快速得到降维结果,最核心的代码是:
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_scaled = StandardScaler().fit_transform(X)
X_pca = PCA(n_components=2).fit_transform(X_scaled)10. 小结
PCA 的本质是寻找一组新的正交坐标轴,使数据投影后的方差尽可能大。
核心公式为:
其中最大特征值对应的特征向量就是第一主成分方向,前
PCA 的优点是简单、可解释、计算高效;缺点是只能捕捉线性结构,并且对特征尺度比较敏感。