PCA 降维
一、直观理解:给高维数据选择最佳拍摄角度
PCA(Principal Component Analysis,主成分分析)可以理解为:给高维数据寻找一个最合适的观察角度,再把它投影到更低维的空间。
想象桌上放着一个三维茶壶,现在需要用一张二维照片展示它。如果从正上方拍摄,照片里可能只有几个圆形,很难看出壶嘴和把手;如果从侧前方拍摄,茶壶的轮廓和主要特征就能得到较完整的保留。
PCA 所做的事情与此类似。它在高维空间中寻找数据分布最分散的方向,也就是方差最大的方向,并将数据投影到这些方向上。
这些新的投影方向称为主成分:
- 第一主成分保留的数据方差最大;
- 第二主成分在与第一主成分正交的条件下保留尽可能大的方差;
- 后续主成分依次类推。
PCA 不会简单删除某几个原始变量,而是把原始变量重新组合成少数几个新的综合变量。
例如,若“数学成绩”和“物理成绩”高度相关,PCA 可能将二者的大部分共同信息浓缩到一个新的主成分中。这个主成分可以理解为某种“理科综合能力”,但其具体含义仍需根据载荷进行判断。
需要特别注意:PCA 属于特征提取,而不是特征筛选。降维后的主成分是原始变量的线性组合,不再等同于某个原始变量。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 原始变量较多,并且变量之间存在明显相关性;需要缓解多重共线性;需要将高维数据压缩到二维或三维进行可视化;需要用少数综合指标概括多个原始指标;希望降低后续聚类、回归或分类模型的计算量。 |
| 核心优点 | 不需要标签即可提取数据的主要变化方向;主成分之间彼此正交且线性不相关;可以压缩冗余变量;在固定降维维数的线性投影中,PCA 能使数据的平方重构误差最小。 |
| 局限与缺点 | 主成分是多个变量的线性组合,实际含义可能不够直观;只能提取线性结构;对异常值较敏感;方差最大的方向不一定是对预测目标最有用的方向;变量量纲不一致时,结果容易被数值范围较大的变量主导。 |
主成分之间“不相关”并不等于“相互独立”。只有在某些特殊分布条件下,例如数据服从多元正态分布时,二者才可能同时成立。
使用 PCA 前通常需要完成以下检查:
- 确认参与分析的变量主要是数值型变量;
- 处理缺失值和明显异常值;
- 判断各变量的量纲和数量级是否一致;
- 检查变量之间是否存在值得压缩的相关结构;
- 明确降维的目的,是可视化、综合评价,还是为后续模型提供输入。
如果不同变量的量纲或数量级差异较大,通常应先进行标准化。标准化只能消除量纲和数值范围的影响,不能消除异常值的影响。
三、核心原理:寻找方差最大的投影方向
设经过中心化或标准化的数据矩阵为 ,其中有 个样本和 个原始变量。
PCA 的核心过程可以概括为三步。
1. 计算协方差矩阵
首先计算变量之间的协方差矩阵:
协方差矩阵描述了各变量自身的波动程度以及变量之间共同变化的情况。
2. 对协方差矩阵进行特征值分解
求解协方差矩阵的特征值和特征向量:
其中:
- 是第 个主成分的投影方向;
- 表示数据沿该方向投影后的方差;
- 特征值越大,该方向保留的数据变化越多。
可以把特征向量理解为“拍摄方向”,把特征值理解为这个方向能够展示的数据变化量。
将特征值从大到小排列后,选择前 个特征向量组成投影矩阵:
3. 将原始数据投影到低维空间
降维后的主成分得分矩阵为:
原始数据有 个变量,而矩阵 只有 个主成分。当 时,就完成了从 维到 维的降维。
PCA 只减少变量数量,不会减少样本数量。
四、如何确定保留几个主成分
第 个主成分的方差贡献率为:
前 个主成分的累计方差贡献率为:
累计方差贡献率表示前 个主成分共同保留了原始数据多少比例的方差。
常见的选择方法包括:
- 保留累计方差贡献率达到 85% 或 90% 的前若干个主成分;
- 观察碎石图,在特征值下降速度明显变缓的位置截断;
- 比较不同主成分数量对后续模型效果的影响;
- 为二维可视化直接保留前两个主成分,但同时报告它们的累计贡献率。
85% 或 90% 只是经验标准,不是必须遵守的固定规则。如果 PCA 用于预测或分类,应结合交叉验证判断主成分数量,而不能只看累计贡献率。
五、MATLAB 示例
假设有 5 名学生的数学、物理和文学成绩。数学和物理成绩可能存在较强相关性,因此可以尝试使用 PCA 将三个原始变量压缩为两个主成分。
% 每一行表示一名学生
% 三列依次表示:数学、物理、文学
X = [
90, 85, 88;
92, 90, 70;
60, 65, 95;
55, 50, 90;
80, 85, 80
];
% 变量名称
featureNames = ["数学", "物理", "文学"];
% 标准化,消除不同均值和标准差的影响
Z = zscore(X);
% PCA
% coeff:各主成分的投影方向
% score:每个样本的主成分得分
% latent:各主成分对应的特征值
% explained:各主成分的方差贡献率,单位为百分比
[coeff, score, latent, explained] = pca(Z);
% 计算累计方差贡献率
cumulativeExplained = cumsum(explained);
% 选择累计贡献率首次达到 90% 时的主成分数量
k = find(cumulativeExplained >= 90, 1);
% 提取降维结果
X_reduced = score(:, 1:k);
disp("各主成分的方差贡献率(%):");
disp(explained);
disp("累计方差贡献率(%):");
disp(cumulativeExplained);
disp("保留的主成分数量:");
disp(k);
disp("降维后的数据:");
disp(X_reduced);
% 查看主成分系数
loadingTable = array2table( ...
coeff, ...
"RowNames", featureNames, ...
"VariableNames", ...
compose("PC%d", 1:size(coeff, 2)) ...
);
disp("主成分系数:");
disp(loadingTable);
如果只希望将数据投影到二维空间进行观察,可以直接提取前两个主成分:
X_reduced_2D = score(:, 1:2);
studentNames = ["学生1", "学生2", "学生3", "学生4", "学生5"];
figure;
scatter(X_reduced_2D(:, 1), X_reduced_2D(:, 2), 60, "filled");
text( ...
X_reduced_2D(:, 1), ...
X_reduced_2D(:, 2), ...
studentNames, ...
"VerticalAlignment", "bottom" ...
);
xlabel("第一主成分");
ylabel("第二主成分");
title("学生成绩的 PCA 二维投影");
grid on;
六、如何解释结果
MATLAB 返回的 coeff 是主成分系数矩阵。矩阵的每一列对应一个主成分,每一行对应一个原始变量。
如果第一主成分在数学和物理上的系数绝对值较大,而文学上的系数较小,则第一主成分可能主要反映理科成绩的共同变化。
解释载荷时应注意:
- 系数绝对值越大,变量对该主成分方向的影响通常越明显;
- 正负号表示变量在该方向上的关系,但整列符号可以同时翻转;
- 特征向量整体乘以 后仍是同一个主成分方向;
- 不应仅凭数学结果强行为主成分赋予实际含义。
完整的 PCA 结果通常应报告:
- 原始变量数量;
- 是否进行标准化;
- 保留的主成分数量;
- 各主成分的方差贡献率;
- 累计方差贡献率;
- 主要变量在各主成分上的系数;
- 主成分的实际含义;
- 降维后数据的用途;
- 降维前后模型效果的比较。
七、常见误区
1. 认为 PCA 会自动选择重要原始变量
PCA 生成的是原始变量的线性组合,并不会直接选出若干原始变量。如果需要保留变量原有含义,应考虑 Lasso、逐步回归或其他特征筛选方法。
2. 认为方差最大的方向一定最有预测价值
PCA 不使用预测标签。某个方差较小的方向仍可能包含与预测目标密切相关的信息,因此不能仅凭贡献率判断预测效果。
3. 忽略量纲差异
如果一个变量的数值范围远大于其他变量,它可能主导主成分方向。变量单位不一致时,通常应先进行标准化。
4. 忽略异常值
PCA 依赖均值和协方差。少数极端样本可能显著改变主成分方向,因此应在降维前检查异常值,必要时考虑稳健 PCA。
5. 过度解释主成分
主成分首先是数学上的投影方向。只有当主要载荷变量具有共同且清晰的实际意义时,才适合为主成分命名。
八、小结
PCA 的核心思想可以概括为:
寻找数据方差最大的若干个正交方向,并将原始数据投影到这些方向上,用较少的新变量表示原始数据。
它适合处理变量较多、相关性较强的数值型数据,也常用于可视化、综合评价和模型预处理。
PCA 的优势是结构清晰、计算方便,但它只能提取线性结构,而且生成的主成分可能缺乏直观解释。因此,使用 PCA 时不能只报告累计方差贡献率,还应结合载荷、实际背景和后续模型效果判断降维是否真正有意义。