内容摘要:
本文深入解析主成分回归(PCR)的原理与MATLAB实现,结合Hald水泥数据案例对比PCR与普通回归的性能差异。详细讲解特征值筛选策略(累积贡献率、交叉验证),并提供单参数估计优化方法。通过完整代码与可视化结果,助力读者掌握高维数据建模与多重共线性处理技巧。
关键词:主成分回归 特征值筛选 多重共线性 MATLAB实现 交叉验证—
1. 主成分回归(PCR)概述
主成分回归(Principal Component Regression, PCR)是主成分分析(PCA)与线性回归的结合方法,旨在解决多重共线性问题。当自变量高度相关时,传统最小二乘法(OLS)的回归系数估计不稳定,而PCR通过降维消除共线性,提升模型鲁棒性。其核心步骤包括:
- PCA降维:提取主成分作为新自变量。
- 回归建模:用主成分对因变量进行线性拟合。
- 结果反演:将主成分回归系数映射回原始变量空间。
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λi∑i=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 |
---|---|---|---|---|---|
1 | 7 | 26 | 6 | 60 | 78.5 |
2 | 1 | 29 | 15 | 52 | 74.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.23−0.82−0.250.231.00−0.14−0.97−0.82−0.141.000.03−0.25−0.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.01≈95.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.27x2−0.14x3−0.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.10x3−0.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λi−1+θ 或
θ
λ
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 核心要点
- PCR优势:通过降维解决多重共线性,提升模型泛化能力。
- 特征值筛选:累积贡献率与交叉验证结合,平衡信息损失与模型复杂度。
- MATLAB工具:
pca
、fitlm
、kfoldLoss
是实现PCR的核心函数。
7.2 应用场景
- 经济学:构建宏观经济指标。
- 生物信息学:提取基因表达特征。
- 工程学:优化传感器数据建模。