问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【回归预测】多元岭回归 (Ridge Regression) -MATLAB

创作时间:
作者:
@小白创作中心

【回归预测】多元岭回归 (Ridge Regression) -MATLAB

引用
CSDN
1.
https://m.blog.csdn.net/2303_77200324/article/details/145787842

一、前言

随着数据科学和机器学习的迅猛发展,回归分析作为一种经典的统计学方法,广泛应用于经济学、金融学、工程学等领域。在回归问题中,最小二乘法是一种常用的优化方法。然而,当面对多重共线性问题时,普通的线性回归方法可能会表现不佳。为了解决这一问题,多元岭回归(Ridge Regression)应运而生,它通过在损失函数中加入L2正则化项,有效避免了多重共线性和过拟合问题。

本文将通过一个多元岭回归的实现示例,详细介绍多元岭回归的原理、相关公式及其应用,并逐步解析MATLAB代码的每个部分。通过实验,我们将展示如何使用多元岭回归进行模型训练、预测和性能评估。

二、技术与原理简介

多元岭回归(Ridge Regression)是一种在线性回归的基础上,加入L2正则化项的回归模型。该方法通过惩罚回归系数的大小,减少模型的复杂度,从而提高其泛化能力。特别适用于自变量之间存在多重共线性(即自变量之间存在线性关系)的情况。

1. 岭回归的基本思想

岭回归的目标是通过最小化带有正则化项的损失函数来拟合模型。在普通最小二乘回归中,目标是最小化残差平方和:

其中,$y$ 为目标变量,$X$ 为自变量矩阵,$\beta$ 为回归系数,$\hat{y}^i$ 为预测值。

在岭回归中,目标函数增加了一个正则化项,用来惩罚回归系数的大小:

其中,$\lambda$ 是正则化参数,$\lambda \geq 0$。当$\lambda=0$时,岭回归退化为普通的最小二乘回归;当$\lambda$很大时,回归系数趋近于零,模型更加简单。

2. 岭回归的公式推导

为求解最优回归系数,我们对目标函数 $J(\beta)$ 进行最小化,得到以下推导结果:

目标函数:

对 $\beta$ 求导并令其为零:

解得:

其中,$I$ 是单位矩阵。最终,岭回归的解为:

这个公式表明,岭回归通过对矩阵 $X^TX$ 加上正则化项 $\lambda I$,解决了普通最小二乘回归中可能出现的多重共线性问题。

3. 参数选择

  • 岭迹分析:观察不同$\lambda$ 下系数变化曲线,选择趋于稳定的临界点
  • 交叉验证:通过K折交叉验证最小化预测误差

三、代码详解

本文的 MATLAB 代码主要分为以下几个部分:

1. 数据加载与预处理

clear,clc;close all;tic
load data1 data1
rng(43,'twister')
N=length(data1);  
temp=randperm(N);
ttt=2;ppp=950;f_=ttt;
P_train = data1(temp(1: ppp), 1: ttt)';
T_train = data1(temp(1: ppp), ttt+1)';
M = size(P_train, 2);
P_test = data1(temp(ppp+1: end), 1: ttt)';
T_test = data1(temp(ppp+1: end), ttt+1)';
N = size(P_test, 2);  

说明

  • 通过 load 加载数据,并利用 randperm 随机打乱顺序,确保样本的随机性。
  • 按照预设的样本数(前 950 个为训练集,其余为测试集)划分数据。
  • 数据转置后以列向量形式存储,便于后续矩阵计算。

2. 数据归一化及转置

%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output); 
%%  转置以适应模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';

说明

  • 使用 mapminmax 函数将数据缩放到 [0,1] 区间,这有助于提高网络训练的稳定性和收敛速度。
  • 分别对输入数据和目标数据进行归一化处理,后续在仿真测试时再将结果反归一化还原。
  • 由于 MATLAB 中的回归模型需要将输入和输出数据转置为列向量,故进行转置操作。

3. 模型创建、训练

%% 模型训练
alpha1=0.05;%置信区间	
[B,FitInfo] = lasso(p_train,t_train,'Alpha',0.01);  	
coef = B(:,1); coef0 = FitInfo.Intercept(1);%常系数
Time=toc;  

说明

  • lasso:使用 LASSO 回归方法(岭回归的变种)进行模型训练。通过设置 Alpha 参数来控制正则化强度,Alpha 越小,正则化越强。
  • BFitInfoB 存储回归系数,FitInfo 包含模型的附加信息,如截距。

4. 仿真测试与数据反归一化

%%  模型预测
t_sim1=coef0+p_train*coef;  %训练集预测结果 	
t_sim2=coef0+p_test*coef;  %测试集预测结果 		
%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
T_sim1=T_sim1';T_sim2=T_sim2';

说明

  • 使用相关函数分别对训练集和测试集进行预测,获取模型输出。
  • 通过 mapminmax('reverse', ...) 将归一化后的预测结果反归一化,恢复到原始数据尺度,便于与真实值比较。

5. 性能评价指标计算

%% 计算评价指标
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);  % 训练集 RMSE
error2 = sqrt(sum((T_test - T_sim2).^2) ./ N);     % 测试集 RMSE
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2; % 训练集 R²
R2 = 1 - norm(T_test - T_sim2)^2 / norm(T_test - mean(T_test))^2;      % 测试集 R²
mse1 = sum((T_sim1 - T_train).^2) ./ M;  % 训练集 MSE
mse2 = sum((T_sim2 - T_test).^2) ./ N;     % 测试集 MSE
SE1 = std(T_sim1 - T_train);
RPD1 = std(T_train) / SE1;               % 训练集剩余预测残差
SE = std(T_sim2 - T_test);
RPD2 = std(T_test) / SE;                 % 测试集 RPD
MAE1 = mean(abs(T_train - T_sim1));       % 训练集 MAE
MAE2 = mean(abs(T_test - T_sim2));        % 测试集 MAE
MAPE1 = mean(abs((T_train - T_sim1) ./ T_train)); % 训练集 MAPE
MAPE2 = mean(abs((T_test - T_sim2) ./ T_test));    % 测试集 MAPE
MBE1 = sum(T_sim1 - T_train) ./ M;        % 训练集 MBE
MBE2 = sum(T_sim2 - T_test) ./ N;         % 测试集 MBE

说明

  • 利用多种指标(RMSE、$R^2$、MSE、RPD、MAE、MAPE、MBE)对模型在训练集和测试集上的表现进行定量评估。
  • 决定系数 $R^2$ 的计算公式为:
    其中 $y_i$ 为实际值,$\hat{y}_i$ 为预测值,$\bar{y}$ 为实际值的均值。

6. 完整代码

clear,clc;close all;tic
load data1 data1
rng(43,'twister')
N=length(data1);  
temp=randperm(N);
ttt=2;ppp=950;f_=ttt;
P_train = data1(temp(1: ppp), 1: ttt)';
T_train = data1(temp(1: ppp), ttt+1)';
M = size(P_train, 2);
P_test = data1(temp(ppp+1: end), 1: ttt)';
T_test = data1(temp(ppp+1: end), ttt+1)';
N = size(P_test, 2);
%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output); 
%%  转置以适应模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
%% 模型训练
alpha1=0.05;%置信区间	
[B,FitInfo] = lasso(p_train,t_train,'Alpha',0.01);  	
coef = B(:,1); coef0 = FitInfo.Intercept(1);%常系数
Time=toc;
%%  模型预测
t_sim1=coef0+p_train*coef;  %训练集预测结果 	
t_sim2=coef0+p_test*coef;  %测试集预测结果 		
%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
T_sim1=T_sim1';T_sim2=T_sim2';
%%  均方根误差 RMSE
error1 = sqrt(sum((T_sim1 - T_train).^2)./M);
error2 = sqrt(sum((T_test - T_sim2).^2)./N);
%% 决定系数
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test -  T_sim2)^2 / norm(T_test -  mean(T_test ))^2;
%% 均方误差 MSE
mse1 = sum((T_sim1 - T_train).^2)./M;
mse2 = sum((T_sim2 - T_test).^2)./N;
%% RPD 剩余预测残差
SE1=std(T_sim1-T_train);
RPD1=std(T_train)/SE1;
SE=std(T_sim2-T_test);
RPD2=std(T_test)/SE;
%% 平均绝对误差MAE
MAE1 = mean(abs(T_train - T_sim1));
MAE2 = mean(abs(T_test - T_sim2));
%% 平均绝对百分比误差MAPE
MAPE1 = mean(abs((T_train - T_sim1)./T_train));
MAPE2 = mean(abs((T_test - T_sim2)./T_test));
%% 平均偏差误差MBE
MBE1 = sum(T_sim1 - T_train) ./ M ;
MBE2 = sum(T_sim2 - T_test ) ./ N ;  

四、总结与思考

本文通过多元岭回归(Ridge Regression)实现了回归问题的建模,并对其进行了详细分析。通过对比不同的评估指标,能够全面地衡量模型的预测性能。岭回归的正则化功能对于解决多重共线性问题和防止过拟合具有显著效果。在实际应用中,我们可以根据数据的特点调整正则化参数,以获得更好的模型效果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号