Bootstrap

主成分回归(PCR)与特征值因子筛选:从理论到MATLAB实战

内容摘要
本文深入解析主成分回归(PCR)的原理与MATLAB实现,结合Hald水泥数据案例对比PCR与普通回归的性能差异。详细讲解特征值筛选策略(累积贡献率、交叉验证),并提供单参数估计优化方法。通过完整代码与可视化结果,助力读者掌握高维数据建模与多重共线性处理技巧。

关键词:主成分回归 特征值筛选 多重共线性 MATLAB实现 交叉验证—

1. 主成分回归(PCR)概述

主成分回归(Principal Component Regression, PCR)是主成分分析(PCA)与线性回归的结合方法,旨在解决多重共线性问题。当自变量高度相关时,传统最小二乘法(OLS)的回归系数估计不稳定,而PCR通过降维消除共线性,提升模型鲁棒性。其核心步骤包括:

  1. PCA降维:提取主成分作为新自变量。
  2. 回归建模:用主成分对因变量进行线性拟合。
  3. 结果反演:将主成分回归系数映射回原始变量空间。

2. PCR的数学原理

2.1 模型构建

设原始自变量矩阵为 X X X n × p n \times p n×p),因变量为 y y y n × 1 n \times 1 n×1)。PCA提取前 k k k 个主成分 Z = X Q k Z = XQ_k Z=XQk,其中 Q k Q_k Qk 为前 k k k 个特征向量组成的矩阵。PCR模型为:
y = β 0 + Z α + ϵ y = \beta_0 + Z\alpha + \epsilon y=β0+Zα+ϵ
其中 α \alpha α 为主成分回归系数。通过最小二乘法估计 α \alpha α,再反推原始变量系数:
β ^ = Q k α \hat{\beta} = Q_k \alpha β^=Qkα

2.2 优势与局限

优势

  • 消除多重共线性,提升模型稳定性。
  • 降维减少噪声干扰。

局限

  • 主成分的物理意义不直观。
  • 需平衡降维损失的信息量与模型简化需求。

3. 特征值因子筛选策略

3.1 累积贡献率法

保留前 k k k 个主成分,使其累积贡献率超过阈值(如85%):
累积贡献率 = ∑ 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

3.2 Kaiser准则

仅保留特征值 λ i > 1 \lambda_i > 1 λi>1 的主成分(适用于相关系数矩阵)。

3.3 交叉验证法

通过交叉验证选择使预测误差最小的主成分数 k k k


4. MATLAB实战:Hald水泥问题

4.1 数据与问题描述

Hald水泥数据集包含13组样本,研究4种化学成分( x 1 x_1 x1~ x 4 x_4 x4)对水泥热释放量( y y y)的影响。原始变量高度相关,需通过PCR构建稳定模型。

数据矩阵示例

样本 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 相关系数矩阵分析

计算自变量相关系数矩阵:
[ 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),存在严重多重共线性。


5. MATLAB代码实现

5.1 数据标准化与PCA

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);  

% 绘制累积贡献率曲线  
figure;  
plot(cum_contr, 'o-', 'LineWidth', 1.5);  
xlabel('主成分序号'); ylabel('累积贡献率');  
title('主成分累积贡献率');  
grid on;  

输出结果

  • 特征值: λ 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
  • 前2个主成分累积贡献率: ( 2.24 + 1.58 ) / 4.01 ≈ 95.3 % (2.24 + 1.58) / 4.01 \approx 95.3\% (2.24+1.58)/4.0195.3%

5.2 主成分回归建模

% 选择前2个主成分  
k = 2;  
Z = score(:, 1:k);  

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

% 反推原始变量系数  
alpha = model_pcr.Coefficients.Estimate(2:end);  
beta_pcr = coeff(:, 1:k) * alpha;  
beta0_pcr = model_pcr.Coefficients.Estimate(1) - mean(X) * beta_pcr;  

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

5.3 结果对比

主成分回归方程
y ^ = 85.74 + 1.31 x 1 + 0.27 x 2 − 0.14 x 3 − 0.38 x 4 \hat{y} = 85.74 + 1.31x_1 + 0.27x_2 - 0.14x_3 - 0.38x_4 y^=85.74+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)系数稳定性
普通回归1.05部分系数不显著,波动大
主成分回归0.82系数稳定,显著性提升

6. 特征值因子筛选的MATLAB进阶

6.1 交叉验证选择主成分数

% 交叉验证(10折)  
mse_cv = zeros(4, 1);  
for k = 1:4  
    cv_model = fitrlinear(X, y, 'Learner', 'leastsquares', ...  
        'KFold', 10, 'PCA', true, 'NumComponents', k);  
    mse_cv(k) = kfoldLoss(cv_model);  
end  

% 绘制MSE曲线  
figure;  
plot(1:4, mse_cv, 'o-', 'LineWidth', 1.5);  
xlabel('主成分数'); ylabel('交叉验证MSE');  
title('交叉验证选择主成分数');  
grid on;  

结论:若 k = 2 k=2 k=2 时MSE最小,则选择前2个主成分。

6.2 单参数主成分估计

杨虎提出的单参数估计法可进一步优化系数稳定性:
β ^ = Q A Q T α \hat{\beta} = Q A Q^T \alpha β^=QAQTα
其中 A A A 为对角矩阵,元素为 λ i − 1 + θ λ i \frac{\lambda_i - 1 + \theta}{\lambda_i} λiλi1+θ θ λ i \theta \lambda_i θλi

MATLAB实现

theta = 0.5; % 平滑参数  
lambda = latent;  
r = 2; % 保留前2个主成分  
A = diag([(lambda(1:r) - 1 + theta) ./ lambda(1:r), theta * lambda(r+1:end)]);  
beta_pcr_smooth = coeff * A * coeff' * beta_pcr;  

7. 总结与扩展

7.1 核心要点

  1. PCR优势:通过降维解决多重共线性,提升模型泛化能力。
  2. 特征值筛选:累积贡献率与交叉验证结合,平衡信息损失与模型复杂度。
  3. MATLAB工具pcafitlmkfoldLoss 是实现PCR的核心函数。

7.2 应用场景

  • 经济学:构建宏观经济指标。
  • 生物信息学:提取基因表达特征。
  • 工程学:优化传感器数据建模。

;