基于MATLAB的多元线性回归模型实现与性能评估
基于MATLAB的多元线性回归模型实现与性能评估
一、前言
在数据分析和机器学习领域,回归分析是一种广泛应用于预测和建立模型的技术。本文将探讨如何利用多元线性回归模型进行数据预测,并通过MATLAB实现其在实际数据集上的应用。多元线性回归通过建立自变量与因变量之间的线性关系,能够帮助我们预测未知数据的结果,广泛应用于经济学、工程学、医学等多个领域。
本文将详细介绍多元线性回归的基本原理、相关公式、模型训练过程,并通过代码实现模型的建立、预测以及评估。我们将以一个实际数据集为例,展示如何使用MATLAB进行数据的预处理、回归模型的训练、结果预测及模型评估。
二、技术与原理简介
多元线性回归(Multiple Linear Regression, MLR)是一种统计学方法,用于分析多个自变量(输入特征)与一个因变量(目标输出)之间的线性关系。在回归问题中,我们通过建立一个线性方程来预测因变量的值。
1. 数学模型
设因变量 $y$ 与 $p$ 个自变量 $x_1, x_2, \ldots, x_p$ 之间存在线性关系,模型表达式为:
其中:
- $\beta_0$:截距项
- $\beta_1, \ldots, \beta_p$:回归系数
- $\epsilon$:随机误差项,服从 $\epsilon \sim N(0, \sigma^2)$
2. 参数估计(最小二乘法)
目标是最小化残差平方和(RSS):
参数估计值 $\hat{\beta}$ 通过矩阵运算求解:
其中 $X$ 为设计矩阵(含截距项),$y$ 为观测值向量。
3. 统计检验
决定系数(R²)
反映模型解释变量变异的比例,$R^2 \in [0,1]$,越接近1拟合越好。
p值检验
假设检验 $H_0: \beta_j = 0$ vs $H_1: \beta_j \neq 0$,通过 t 统计量计算:
若 $p < 0.05$,拒绝原假设,认为变量 $x_j$ 对 $y$ 有显著影响。
三、代码详解
本文的 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] 区间,这有助于提高网络训练的稳定性和收敛速度。 - 分别对输入数据和目标数据进行归一化处理,后续在仿真测试时再将结果反归一化还原。
3. 网络创建、训练
%% 模型训练
X = ones(size(p_train, 1), 1);
p_train1 = [X, p_train];
alpha1 = 0.05; % 置信区间
disp('多元线性回归预测')
[b, bint, r, rint, stats] = regress(t_train, p_train1, alpha1);
disp('线性系数:'); disp(b)
disp(['R方系数:', num2str(stats(1))]) % R方 接近1线性相关性越强
disp(['p检验值: ', num2str(stats(3))]) % p<0.05 默认显著性水平,代表 y 和 X 中的预测变量之间存在显著的线性回归关系
Time = toc;
说明:
- 为数据添加一个常数列(偏置项),以适应线性回归的形式。
- 使用
regress
函数进行多元线性回归分析,获取回归系数 $b$、置信区间(bint
)、残差(r
)以及回归模型的统计量(stats
)。 stats(1)
是 R² 值,表示模型的拟合度;stats(3)
是 p-value,表示回归系数的显著性。
4. 仿真测试与数据反归一化
%% 模型预测
t_sim1 = b(1) + p_train * b(2:end); % 训练集预测结果
t_sim2 = b(1) + p_test * b(2:end); % 测试集预测结果
%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
T_sim1 = T_sim1'; T_sim2 = T_sim2';
说明:
- 使用回归模型的系数 $b$ 进行训练集和测试集的预测。
- 通过
mapminmax('reverse', ...)
将归一化后的预测结果反归一化,恢复到原始数据尺度,便于与真实值比较。
5. 性能评价指标计算
%% 均方根误差 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;
说明:
- 利用多种指标(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';
%% 模型训练
X = ones(size(p_train, 1), 1);
p_train1 = [X, p_train];
alpha1 = 0.05; % 置信区间
disp('多元线性回归预测')
[b, bint, r, rint, stats] = regress(t_train, p_train1, alpha1);
disp('线性系数:'); disp(b)
disp(['R方系数:', num2str(stats(1))]) % R方 接近1线性相关性越强
disp(['p检验值: ', num2str(stats(3))]) % p<0.05 默认显著性水平,代表 y 和 X 中的预测变量之间存在显著的线性回归关系
Time = toc;
%% 模型预测
t_sim1 = b(1) + p_train * b(2:end); % 训练集预测结果
t_sim2 = b(1) + p_test * b(2:end); % 测试集预测结果
%% 数据反归一化
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;
四、总结与思考
本文通过多元线性回归模型进行数据预测,并结合MATLAB进行实现。通过归一化数据、训练回归模型、预测结果、反归一化以及多种模型评估指标,我们可以全面分析回归模型的表现。$R^2$、均方根误差、平均绝对误差等指标有助于我们判断模型的拟合程度和预测精度。通过这种方式,我们能够快速建立和评估多元线性回归模型,在实践中为数据分析和预测提供有效的工具。