PCA 主成分分析
寻找互相正交、依次最大化投影方差的线性方向,用更少维度保留主要变化。
学习前需要掌握
背景与问题
多个测量维度可能沿同一潜在变化方向一起移动。PCA 用少量互相正交的方向表示这些变化,有助于压缩和观察,但其目标没有利用标签。
概念定义
主成分分析对中心化数据寻找依次最大化投影方差的正交方向。transform 将减去训练均值的数据投影,inverse_transform 从保留坐标近似重建。
直观理解
把坐标轴旋转到点云延展最明显的方向,先保留最长的方向,再按需要保留次长方向。
核心原理
中心化后的协方差特征向量或 SVD 右奇异向量给出主方向,特征值反映投影方差。保留前 k 维在平方重构误差意义下有最优线性性质,但不保证这些方向最利于分类或聚类。
scikit-learn PCA 会中心化,不会自动对各特征缩放。不同单位下是否标准化要依据任务:不处理时大方差单位可能主导,处理后则改变了你要保留的方差信号。whiten 还会重新缩放主成分,不应与普通投影混同。
方向正负不唯一,重复拟合可能出现整体符号翻转而表示同一轴。主成分与均值必须只在训练部分拟合,下游交叉验证应把 PCA 放进 Pipeline;解释方差高不代表保留了标签信息。
完全共线点云的一维无损压缩
- 四点为 (-2,-2)、(-1,-1)、(1,1)、(2,2)
- 数据均值为 (0,0),只保留 1 个主成分
解释方差比例为 1,方向分量绝对值约 0.707107,重构最大误差约为 0。
这里两列完全冗余,因此丢弃正交方向不损失数据。加入垂直方向噪声后,一维重构就不再精确;保留维数需要结合用途和误差。
代码对方向取绝对值只是为了比较同一条轴,原投影仍使用实际方向。不能对每个成分随意取绝对值后再做变换,那会改变一般的数据表示。
数学表达
核心表达
X_c 为按训练均值中心化后的矩阵,V_k 按列放置主方向;sklearn components_ 的行方向约定需转置对应。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1在训练部分决定是否按单位和目标标准化。
- 2拟合均值与主方向,核对解释方差和重构。
- 3在 Pipeline 内验证保留维数对下游任务的影响。
代码对应位置
示例 1完全共线点云的一维无损压缩的最小验证:使用完整构造输入核对完全共线点云的一维无损压缩,输出只表示本例计算。
计算与实现步骤
- 在训练部分决定是否按单位和目标标准化。
- 拟合均值与主方向,核对解释方差和重构。
- 在 Pipeline 内验证保留维数对下游任务的影响。
代码实现
示例 1
完全共线点云的一维无损压缩的最小验证
example_01.py用途:使用完整构造输入核对完全共线点云的一维无损压缩,输出只表示本例计算。
import numpy as np
from sklearn.decomposition import PCA
x = np.array([[-2., -2.], [-1., -1.], [1., 1.], [2., 2.]])
pca = PCA(n_components=1, svd_solver="full")
z = pca.fit_transform(x)
reconstructed = pca.inverse_transform(z)
print("direction absolute:", np.round(np.abs(pca.components_[0]), 6).tolist())
print(f"variance_ratio={pca.explained_variance_ratio_[0]:.6f}")
print(f"max_reconstruction_error={np.max(np.abs(x - reconstructed)):.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对完全共线点云的一维无损压缩,输出只表示本例计算。
Step 1 · 1–9 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.decomposition import PCA
x = np.array([[-2., -2.], [-1., -1.], [1., 1.], [2., 2.]])
pca = PCA(n_components=1, svd_solver="full")
z = pca.fit_transform(x)
reconstructed = pca.inverse_transform(z)
print("direction absolute:", np.round(np.abs(pca.components_[0]), 6).tolist())
print(f"variance_ratio={pca.explained_variance_ratio_[0]:.6f}")
print(f"max_reconstruction_error={np.max(np.abs(x - reconstructed)):.6f}")预期输出或运行结果
direction absolute: [0.707107, 0.707107] variance_ratio=1.000000 max_reconstruction_error=0.000000
常见错误 · 3 条
- 不标准化
- 把主成分当原始特征
- 完整数据先 PCA
实际应用
- 相关连续特征的线性压缩
- 高维点云可视化与去冗余
常见错误
- 不标准化
- 把主成分当原始特征
- 完整数据先 PCA