内容摘要:
本文深入解析主成分回归(PCR)的原理与MATLAB实现,结合Hald水泥数据案例对比PCR与普通回归的性能差异。详细讲解特征值筛选策略(累积贡献率、交叉验证),并提供单参数估计优化方法。通过完整代码与可视化结果,助力读者掌握高维数据建模与多重共线性处理技巧。
关键词:主成分回归 特征值筛选 多重共线性 MATLAB实现 交叉验证—
主成分回归(Principal Component Regression, PCR)是主成分分析(PCA)与线性回归的结合方法,旨在解决多重共线性问题。当自变量高度相关时,传统最小二乘法(OLS)的回归系数估计不稳定,而PCR通过降维消除共线性,提升模型鲁棒性。其核心步骤包括:
设原始自变量矩阵为 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α
优势:
局限:
保留前 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
仅保留特征值 λ i > 1 \lambda_i > 1 λi>1 的主成分(适用于相关系数矩阵)。
通过交叉验证选择使预测误差最小的主成分数 k k k。
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 |
… | … | … | … | … | … |
计算自变量相关系数矩阵:
[ 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),存在严重多重共线性。
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;
输出结果:
% 选择前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);
主成分回归方程:
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 | 系数稳定,显著性提升 |
% 交叉验证(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个主成分。
杨虎提出的单参数估计法可进一步优化系数稳定性:
β ^ = 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;
pca
、fitlm
、kfoldLoss
是实现PCR的核心函数。