主成分分析(PCA)详解:从理论到MATLAB实战

内容摘要
本文系统讲解主成分分析(PCA)的数学原理、MATLAB实现及实战应用。通过Hald水泥数据案例,对比普通回归与主成分回归的性能,解析PCA在解决多重共线性、数据降维中的核心作用。提供完整代码与可视化方法,助力读者掌握特征值分解、累积贡献率计算等关键技能。

关键词:主成分分析 数据降维 特征值分解 MATLAB实现 多重共线性


1. 主成分分析概述

主成分分析(Principal Component Analysis, PCA)是一种经典的数据降维技术,由Karl Pearson于1901年提出,后由Hotelling推广至多元统计分析领域。其核心目标是通过线性变换将高维数据映射到低维空间,保留数据的主要变异信息。PCA广泛应用于数据压缩、特征提取、噪声过滤等场景,是探索性数据分析(EDA)的重要工具。


2. PCA的数学原理

2.1 基本思想

假设数据集包含 p p p 个变量 X 1 , X 2 , … , X p X_1, X_2, \dots, X_p X1,X2,,Xp,PCA通过构造一组新的正交变量(主成分) Z 1 , Z 2 , … , Z p Z_1, Z_2, \dots, Z_p Z1,Z2,,Zp,使得:

  1. 方差最大化:每个主成分尽可能保留原始数据的变异信息。
  2. 正交性:主成分之间互不相关。

数学上,主成分是原始变量的线性组合:
Z i = c i 1 X 1 + c i 2 X 2 + ⋯ + c i p X p Z_i = c_{i1}X_1 + c_{i2}X_2 + \dots + c_{ip}X_p Zi=ci1X1+ci2X2++cipXp
其中系数向量 c i = ( c i 1 , c i 2 , … , c i p ) T c_i = (c_{i1}, c_{i2}, \dots, c_{ip})^T ci=(ci1,ci2,,cip)T 满足 c i T c i = 1 c_i^T c_i = 1 ciTci=1

2.2 协方差矩阵与特征分解

PCA的核心是对协方差矩阵(或相关系数矩阵)进行特征分解。假设数据矩阵 X X X 已标准化(均值为0,方差为1),则协方差矩阵为:
Σ = 1 n − 1 X T X \Sigma = \frac{1}{n-1} X^T X Σ=n11XTX

Σ \Sigma Σ 进行特征值分解:
Σ = Q Λ Q T \Sigma = Q \Lambda Q^T Σ=QΛQT
其中:

  • Λ = diag ( λ 1 , λ 2 , … , λ p ) \Lambda = \text{diag}(\lambda_1, \lambda_2, \dots, \lambda_p) Λ=diag(λ1,λ2,,λp) 为特征值对角矩阵( λ 1 ≥ λ 2 ≥ ⋯ ≥ λ p \lambda_1 \geq \lambda_2 \geq \dots \geq \lambda_p λ1λ2λp)。
  • Q Q Q 为正交矩阵,列向量为对应的特征向量。

主成分的方差:第 i i i 个主成分 Z i Z_i Zi 的方差为 λ i \lambda_i λi

2.3 主成分选择

保留前 k k k 个主成分的标准通常基于:

  1. 累积贡献率:前 k k k 个主成分的方差占比超过阈值(如80%)。
    累积贡献率 = ∑ i = 1 k λ i ∑ i = 1 p λ i \text{累积贡献率} = \frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^p \lambda_i} 累积贡献率=i=1pλii=1kλi
  2. Kaiser准则:保留特征值大于1的主成分(适用于相关系数矩阵)。

3. PCA的MATLAB实现

3.1 核心函数详解

(1)princomppca

功能:计算主成分系数、得分及特征值。

语法

[coeff, score, latent] = pca(X);
  • 输入
    • X n × p n \times p n×p 数据矩阵,每行为一个样本。
  • 输出
    • coeff p × p p \times p p×p 主成分系数矩阵,每列对应一个主成分的系数向量。
    • score n × p n \times p n×p 主成分得分矩阵,表示样本在主成分空间的投影。
    • latent p × 1 p \times 1 p×1 特征值向量(按降序排列)。
(2)cumsum

功能:计算累积贡献率。

示例

cum_contr = cumsum(latent) / sum(latent);  
plot(cum_contr, 'o-'); % 绘制累积贡献率曲线  
(3)biplot

功能:绘制双标图(Biplot),可视化主成分得分与变量载荷。

语法

biplot(coeff(:,1:2), 'Scores', score(:,1:2));  

3.2 完整代码流程

% 数据标准化  
X = zscore(raw_data);  

% 计算主成分  
[coeff, score, latent] = pca(X);  

% 计算累积贡献率  
cum_contr = cumsum(latent) / sum(latent);  

% 选择主成分(例如保留前2个)  
k = 2;  
selected_coeff = coeff(:, 1:k);  
selected_score = score(:, 1:k);  

% 可视化  
figure;  
plot(cum_contr, 'o-'); % 累积贡献率曲线  
xlabel('主成分序号'); ylabel('累积贡献率');  

figure;  
biplot(coeff(:,1:2), 'Scores', score(:,1:2));  

4. 实战案例:Hald水泥问题

4.1 背景与数据

Hald水泥数据集包含13组观测,研究4种化学成分( x 1 x_1 x1~ x 4 x_4 x4)对水泥热释放量( y y y)的影响。目标是利用PCA解决多重共线性问题。

数据矩阵

样本 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 y y y
172666078.5
2129155274.3

4.2 相关系数矩阵分析

计算4个变量的相关系数矩阵:
[ 1.00 0.23 − 0.82 − 0.25 0.23 1.00 − 0.14 − 0.97 − 0.82 − 0.14 1.00 0.03 − 0.25 − 0.97 0.03 1.00 ] \begin{bmatrix} 1.00 & 0.23 & -0.82 & -0.25 \\ 0.23 & 1.00 & -0.14 & -0.97 \\ -0.82 & -0.14 & 1.00 & 0.03 \\ -0.25 & -0.97 & 0.03 & 1.00 \\ \end{bmatrix} 1.000.230.820.250.231.000.140.970.820.141.000.030.250.970.031.00
发现 x 2 x_2 x2 x 4 x_4 x4 高度负相关( r = − 0.97 r = -0.97 r=0.97),存在严重多重共线性。

4.3 PCA降维步骤

  1. 数据标准化

    X = zscore([x1, x2, x3, x4]);  
    
  2. 计算主成分

    [coeff, score, latent] = pca(X);  
    

    输出特征值: λ 1 = 2.24 , λ 2 = 1.58 , λ 3 = 0.19 , λ 4 = 0.002 \lambda_1 = 2.24, \lambda_2 = 1.58, \lambda_3 = 0.19, \lambda_4 = 0.002 λ1=2.24,λ2=1.58,λ3=0.19,λ4=0.002

  3. 选择主成分

    • 前两个主成分累积贡献率为 ( 2.24 + 1.58 ) / 4.01 ≈ 95.3 % (2.24 + 1.58) / 4.01 \approx 95.3\% (2.24+1.58)/4.0195.3%,保留前2个主成分。
  4. 主成分回归

    • 用主成分得分作为新自变量,拟合回归模型。
    Z = score(:, 1:2); % 前两个主成分得分  
    model = fitlm(Z, y);  
    
  5. 结果对比

    • 普通最小二乘法:回归系数不稳定,部分系数不显著。
    • 主成分回归:系数更稳定,均方误差(MSE)更低。

5. MATLAB代码详解

5.1 主成分回归完整代码

clc; clear;  
load sn.txt; % 加载数据(x1~x4, y)  
X = sn(:, 1:4); y = sn(:, 5);  

% 数据标准化  
X = zscore(X);  
y = zscore(y);  

% 计算主成分  
[coeff, score, latent] = pca(X);  
cum_contr = cumsum(latent) / sum(latent);  

% 选择主成分数(例如k=3)  
k = 3;  
Z = score(:, 1:k);  

% 主成分回归  
model_pcr = fitlm(Z, y);  
disp(model_pcr);  

% 对比普通最小二乘法  
model_ols = fitlm(X, y);  
disp(model_ols);  

% 计算均方误差(MSE)  
mse_pcr = model_pcr.MSE;  
mse_ols = model_ols.MSE;  
fprintf('主成分回归MSE: %.4f\n普通回归MSE: %.4f\n', mse_pcr, mse_ols);  

5.2 结果解读

  • 主成分回归方程
    y ^ = 0.85 + 1.31 x 1 + 0.27 x 2 − 0.14 x 3 − 0.38 x 4 \hat{y} = 0.85 + 1.31x_1 + 0.27x_2 - 0.14x_3 - 0.38x_4 y^=0.85+1.31x1+0.27x20.14x30.38x4
  • 普通回归方程
    y ^ = 62.41 + 1.55 x 1 + 0.51 x 2 + 0.10 x 3 − 0.14 x 4 \hat{y} = 62.41 + 1.55x_1 + 0.51x_2 + 0.10x_3 - 0.14x_4 y^=62.41+1.55x1+0.51x2+0.10x30.14x4

结论:主成分回归的系数更稳定,且MSE更低(例如0.82 vs 1.05),验证了PCA在多重共线性场景下的优势。


6. 总结与扩展

6.1 PCA的核心优势

  1. 降维:减少变量数量,简化模型复杂度。
  2. 去相关:消除多重共线性,提升模型稳定性。
  3. 可视化:通过2D/3D投影探索数据结构。

6.2 注意事项

  • 数据标准化:PCA对变量尺度敏感,必须标准化处理。
  • 主成分解释性:主成分是线性组合,物理含义可能不直观。
  • 特征值筛选:避免过度降维导致信息丢失。

6.3 扩展应用

  • 图像压缩:将图像像素投影到主成分空间。
  • 基因表达分析:提取关键基因特征。
  • 金融风险建模:构建低维风险因子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值