数学建模_基于支持回归向量机SVR的回归预测之预测新数据+Matlab代码包教会使用,直接替换数据即可

支持向量回归 (SVR) 模型预测

支持向量回归(Support Vector Regression, SVR)是支持向量机(SVM)的扩展,用于解决回归问题。SVM本身是一个二分类模型,但通过适当的调整和优化,SVM也能用于回归任务。SVR的目标是找到一个最佳的回归平面,使得预测值与实际值之间的误差最小化。

SVR的核心思想如下:

  1. 目标函数:
    • 在SVR中,我们希望找到一个函数 f(x)来近似输入数据 x 和输出数据 y 之间的关系。与传统的回归模型不同,SVR并不是通过最小化误差的总和来寻找最优解,而是通过容忍某个范围内的误差(由 ε-带决定)来确保模型在复杂度和准确性之间取得平衡。
  2. ε-带(ε-insensitive loss):
    • SVR的损失函数不是传统的平方误差损失函数。它只对预测误差超出 ε 的部分进行惩罚,误差小于 ε 时不计入损失。这种方法有效地处理了噪声和过拟合问题,使得模型更具鲁棒性。
  3. 核函数:
    • 与支持向量机一样,SVR也可以使用核函数来处理非线性数据。通过使用核函数,SVR可以在更高维度的特征空间中找到一个线性回归模型。常用的核函数包括线性核、高斯核(RBF核)等。
  4. 优化目标:
    • SVR通过一个优化问题来寻找回归函数。它的优化目标是:
      • 最大化间隔(margin),即支持向量的距离。
      • 在一定容忍范围内最小化误差。

通过这些方法,SVR能够在数据维度较高、噪声较大的情况下,提供一个具有良好泛化能力的回归模型。

本文将通过一个SVR模型来预测数据,过程包括数据预处理、模型训练、预测与评估。本文中使用MATLAB语言来实现这一过程,下面是完整的代码和注释说明。

1. 初始化环境
matlab 复制代码
close all               % 关闭所有图窗
clear                   % 清空工作空间变量
clc                     % 清空命令行窗口

% 设置随机数种子,以确保实验结果可重复
rng(2222)

解释:

  • close all:关闭所有已经打开的图窗。
  • clear:清空工作空间中的所有变量,确保不会有遗留变量影响程序运行。
  • clc:清空命令行窗口,使得输出更加清晰。
  • rng(2222):设置随机数种子,确保每次运行结果一致。
2. 导入数据
matlab 复制代码
% 导入回归数据
res = readmatrix('回归数据.xlsx');  % 读取Excel文件中的数据

解释:

  • 使用 readmatrix 从 Excel 文件中读取数据并存储在变量 res 中。假设数据文件名为 回归数据.xlsx
3. 数据归一化
matlab 复制代码
% 将特征变量 X 和目标变量 Y 进行归一化处理
X = res(:,1:end-1);      % 提取特征变量
Y = res(:,end);          % 提取目标变量
[x, psin] = mapminmax(X', 0, 1);   % 特征归一化
[y, psout] = mapminmax(Y', 0, 1);  % 目标归一化

解释:

  • 从数据中分离出特征变量 X 和目标变量 Y
  • 使用 mapminmax 将数据归一化到 [0, 1] 范围,XY 都进行归一化,得到归一化后的 xy,并保存归一化的参数(psinpsout),以便后续反归一化使用。
4. 划分训练集与测试集
matlab 复制代码
num = size(res, 1);      % 获取样本数量
k = input('是否打乱样本(是:1,否:0):');  % 用户选择是否打乱样本
if k == 0
   state = 1:num;        % 不打乱样本
else
   state = randperm(num);  % 打乱样本
end
ratio = 0.8;             % 训练集占比
train_num = floor(num * ratio);  % 计算训练集大小

% 划分训练集和测试集
x_train = x(:, state(1:train_num))';  % 训练集特征
y_train = y(state(1:train_num))';    % 训练集目标
x_test = x(:, state(train_num+1:end))';  % 测试集特征
y_test = y(state(train_num+1:end))';    % 测试集目标

解释:

  • num = size(res, 1) 获取数据的总样本数。
  • k = input(...) 提示用户是否需要打乱样本。如果 k0,则数据按顺序划分;如果 k1,则数据被随机打乱。
  • 根据设置的 ratio(80%用于训练集),我们计算训练集的样本数 train_num,然后将数据划分为训练集和测试集。
5. 构建 SVR 模型
matlab 复制代码
% 使用高斯核函数训练支持向量回归模型
model = fitrsvm(x_train, y_train, "KernelFunction", "gaussian", ...  % 高斯核函数
    "Solver", "ISDA", ...  % 使用 ISDA 优化算法
    "KernelScale", "auto");  % 核尺度参数自动调整

解释:

  • fitrsvm 函数用于训练支持向量回归模型。我们选择了高斯核函数 "KernelFunction", "gaussian",并使用 "Solver", "ISDA" 优化算法。
  • KernelScale 设置为 "auto",这意味着MATLAB将自动选择一个适合的核尺度。
6. 模型预测
matlab 复制代码
% 使用训练好的模型对训练集和测试集进行预测
re1 = predict(model, x_train);  % 训练集预测
re2 = predict(model, x_test);   % 测试集预测

解释:

  • 使用训练好的模型 model 对训练集 x_train 和测试集 x_test 进行预测,分别得到 re1re2,即训练集和测试集的预测结果。
7. 数据反归一化
matlab 复制代码
% 将预测值从归一化空间反转为原始数据空间
Y_train = Y(state(1:train_num));  % 实际训练集目标
Y_test = Y(state(train_num+1:end));  % 实际测试集目标

% 反归一化预测值
pre1 = mapminmax('reverse', re1, psout);
pre2 = mapminmax('reverse', re2, psout);

解释:

  • 使用 mapminmax('reverse', ...) 将归一化后的预测值 re1re2 反归一化为原始数据空间,得到 pre1pre2
  • Y_trainY_test 为实际的目标值(训练集和测试集的原始目标)。
8. 计算误差与评估指标
matlab 复制代码
% 计算均方根误差 (RMSE)
error1 = sqrt(mean((pre1 - Y_train).^2));
error2 = sqrt(mean((pre2 - Y_test).^2));

% 计算 R2 和 MAE
R1 = 1 - norm(Y_train - pre1)^2 / norm(Y_train - mean(Y_train))^2;
R2 = 1 - norm(Y_test - pre2)^2 / norm(Y_test - mean(Y_test))^2;

mae1 = mean(abs(Y_train - pre1 ));
mae2 = mean(abs(pre2 - Y_test ));

disp('训练集预测精度指标如下:')
disp(['训练集数据的R2为:', num2str(R1)])
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['训练集数据的RMSE为:', num2str(error1)])
disp('测试集预测精度指标如下:')
disp(['测试集数据的R2为:', num2str(R2)])
disp(['测试集数据的MAE为:', num2str(mae2)])
disp(['测试集数据的RMSE为:', num2str(error2)])

解释:

  • 计算训练集和测试集的均方根误差(RMSE)、R2 值和平均绝对误差(MAE)。这些是常用的回归模型评估指标。
  • 使用 disp 函数输出这些指标的值。
9. 结果可视化
matlab 复制代码
% 绘制训练集预测结果对比
figure
plot(1:train_num, Y_train, 'r-^', 1:train_num, pre1, 'b-+', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('样本点')
ylabel('预测值')
title('训练集预测结果对比')

% 绘制测试集预测结果对比
figure
plot(1:num-train_num, Y_test, 'r-^', 1:num-train_num, pre2, 'b-+', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('样本点')
ylabel('预测值')
title('测试集预测结果对比')

% 绘制训练集百分比误差图
figure
plot((pre1 - Y_train)./Y_train, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('训练集百分比误差曲线')

% 绘制测试集百分比误差图
figure
plot((pre2 - Y_test)./Y_test, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('测试集百分比误差曲线')

解释:

  • 绘制多个图窗以可视化预测结果:
    • 训练集和测试集的预测结果与实际结果对比。
    • 训练集和测试集的百分比误差图。
10. 拟合度图
matlab 复制代码
% 绘制拟合度图
figure; 
plotregression(Y_train, pre1, '训练集', ... Y_test, pre2, '测试集'); set(gcf, 'Toolbar', 'figure');

解释:

  • 使用 plotregression 绘制训练集和测试集的回归拟合图,显示预测值与实际值的拟合情况。
11. 新数据预测
matlab 复制代码
% 新数据预测
newdata = xlsread("新的多输入.xlsx");
newy = newpre(newdata, psin, psout, model);
figure
plot(newy)
xlabel('样本点')
ylabel('预测值')
% 保存预测结果
xlswrite("新的输出.xlsx", newy)

% 定义新数据预测函数
function y = newpre(newdata, psin, psout, model)
   % 归一化新数据
   x = mapminmax('apply', newdata', psin);
   % 使用模型进行预测
   pre = predict(model, x');
   % 反归一化预测结果
   y = mapminmax('reverse', pre, psout);
end

解释:

  • 读取新数据(新的多输入.xlsx),并进行归一化处理。
  • 使用训练好的模型对新数据进行预测,并将结果反归一化。
  • 将预测结果保存到一个新的Excel文件(新的输出.xlsx)中。

Matlab代码手把手教运行

为了帮助更多的萌新更快上手数学建模建等竞赛,这里有本文中的完整Matlab代码:

Matlab 复制代码
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%随机数种子固定结果
rng(2222)

%%  导入数据
res = readmatrix('回归数据.xlsx');

%%  数据归一化 索引
X = res(:,1:end-1);
Y = res(:,end);
[x,psin] = mapminmax(X', 0, 1);
%保留归一化后相关参数
[y, psout] = mapminmax(Y', 0, 1);

%%  划分训练集和测试集
num = size(res,1);%总样本数
k = input('是否打乱样本(是:1,否:0):');
if k == 0
   state = 1:num; %不打乱样本
else
   state = randperm(num); %打乱样本
end
ratio = 0.8; %训练集占比
train_num = floor(num*ratio);

x_train = x(:,state(1: train_num))';
y_train = y(state(1: train_num))';

x_test = x(:,state(train_num+1: end))';
y_test = y(state(train_num+1: end))';


%%  svr模型
%核尺度参数(KernelScale)
% 这个参数用于调整数据点的尺度,
% 以便在计算Gram矩阵(一种用于核方法的矩阵)时获得更好的性能。
% 如果设置为'auto',软件会自动选择一个合适的尺度因子。
% 但由于这个过程涉及到子采样,所以每次的估计值可能会有所不同。
% 为了确保结果的可重复性,建议在训练之前设置一个随机数种子
model = fitrsvm(x_train, y_train, "KernelFunction","gaussian",...  %高斯函数,用于计算 Gram 矩阵的核函数,指定 oKernelFunctiond 
    "Solver","ISDA",...  %ISDA优化,支持训练过程中的动态结构调整,并可以降低计算资源需求,减少过拟合风险。
    "KernelScale","auto"); %核尺度参数(KernelScale)

%%  仿真测试
re1 = predict(model, x_train);
re2 = predict(model, x_test );

%%  数据反归一化
%实际值
Y_train = Y(state(1: train_num));
Y_test = Y(state(train_num+1:end));

%预测值
pre1 = mapminmax('reverse', re1, psout);
pre2 = mapminmax('reverse', re2, psout);

%%  均方根误差
error1 = sqrt(mean((pre1 - Y_train).^2));
error2 = sqrt(mean((pre2 - Y_test).^2));

%% 相关指标计算
% R2
R1 = 1 - norm(Y_train - pre1)^2 / norm(Y_train - mean(Y_train))^2;
R2 = 1 - norm(Y_test -  pre2)^2 / norm(Y_test -  mean(Y_test ))^2;

%  MAE
mae1 = mean(abs(Y_train - pre1 ));
mae2 = mean(abs(pre2 - Y_test ));

disp('训练集预测精度指标如下:')
disp(['训练集数据的R2为:', num2str(R1)])
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['训练集数据的RMSE为:', num2str(error1)])
disp('测试集预测精度指标如下:')
disp(['测试集数据的R2为:', num2str(R2)])
disp(['测试集数据的MAE为:', num2str(mae2)])
disp(['测试集数据的RMSE为:', num2str(error2)])

figure
plot(1: train_num, Y_train, 'r-^', 1: train_num, pre1, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('训练集预测结果对比')

%%画图
figure
plot(1: num-train_num, Y_test, 'r-^', 1: num-train_num, pre2, 'b-+', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('样本点')
ylabel('预测值')
title('测试集预测结果对比')

%% 训练集百分比误差图
figure
plot((pre1 - Y_train )./Y_train, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('训练集百分比误差曲线')

%% 测试集百分比误差图
figure
plot((pre2 - Y_test )./Y_test, 'b-o', 'LineWidth', 1)
legend('百分比误差')
xlabel('样本点')
ylabel('误差')
title('测试集百分比误差曲线')

%%  拟合图
figure;
plotregression(Y_train, pre1, '训练集', ...
               Y_test, pre2, '测试集');
set(gcf,'Toolbar','figure');

%% 新数据预测
newdata = xlsread("新的多输入.xlsx");
newy = newpre(newdata,psin,psout,model);
figure
plot(newy)
xlabel('样本点')
ylabel('预测值')
%保存数据
xlswrite("新的输出.xlsx",newy)

function y = newpre(newdata,psin,psout,model)
   %归一化
   x= mapminmax('apply',newdata',psin);
   %预测
   pre = predict(model,x');
   %反归一化
   y = mapminmax('reverse',pre,psout);
end

回归数据

x1 x2 x3 x4 x5 y
3.036226 5613.881 217.475 68.43483 16.82093 48.47907612
4.391658 8450.278 231.6231 60.47683 10.7205 64.12185185
5.248597 8634.475 232.9854 68.74011 11.54856 67.67148734
5.121236 7253.694 244.4692 65.36061 14.36191 59.32753057
4.649021 8647.125 268.3052 63.80132 12.04857 67.98570391
4.267209 5445.033 257.7701 61.68997 7.055625 46.47506598
4.804512 5848.875 234.0968 67.14467 7.656134 47.18442579
3.825803 6583.543 270.7575 61.44453 16.65654 54.0487296
4.787534 9546.304 225.8279 67.89351 11.43665 69.90372309
5.580797 5481.803 287.9043 62.20432 11.26927 47.32012957
3.658919 9482.116 278.8093 61.20217 12.37418 71.68429695
3.829985 9128.034 225.2187 64.81423 16.70461 68.18735427
5.295785 6804.695 282.6947 67.13434 13.61871 58.0309376
5.554308 5340.983 277.2833 69.39466 7.804352 48.77931811
3.159579 8717.524 209.9133 66.73862 16.308 67.56410903
5.844734 5505.52 243.1124 65.76241 8.693192 46.93770398
5.737373 5589.905 276.0056 62.24899 9.415833 48.31135809

新的多输入数据

x1 x2 x3 x4 x5
3.0362257 5613.8808 217.474977 68.434826 16.820930
4.3916581 8450.2778 231.623090 60.476832 10.720498
4.1906122 9183.6836 268.510108 65.818077 11.314169
3.1924095 7145.7749 204.276159 68.232653 16.120057
5.106237 6826.7186 274.117659 60.747998 14.206971
5.8090904 6765.6902 222.187624 67.679680 9.260745
4.7777224 7993.8317 245.455181 67.645996 13.589511
5.1844081 7506.1906 298.051564 64.240220 7.050705
4.5388312 8374.9062 213.576927 68.880672 9.818275
5.5086131 8046.1835 215.520256 66.190751 11.485452
3.6541879 7087.1249 227.665603 63.780741 15.868819
3.4277257 5338.8268 282.415218 63.867885 8.931208
4.3795876 7994.9283 253.039530 69.392088 7.523717
4.0468507 7794.6313 233.166342 64.143550 13.916837
3.7486833 6763.9297 288.611933 67.872152 10.325529

数据表格模型这个放即可 无需修改代码!

相关推荐
HereLi3 小时前
低空经济——飞行汽车运营建模求解问题思路
运维·python·matlab
IT猿手4 小时前
部落竞争与成员合作算法(CTCM)求解5个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
深度学习·算法·机器学习·matlab·无人机·无人机、
元周民6 小时前
matlab中高精度计算函数vpa与非厄米矩阵本征值的求解
matlab·矩阵
終不似少年遊*9 小时前
机器学习模型评估指标
人工智能·算法·机器学习·回归·模型评价
goomind9 小时前
MATLAB深度学习实战文字识别
深度学习·计算机视觉·matlab·ocr·文字识别
烦恼归林13 小时前
电机参数辨识算法(4)——基于正弦电流注入的电感磁链辨识及实验验证
matlab·电机·电力电子·电机控制·simulink仿真
机器学习之心16 小时前
回归预测 | MATLAB实GRU多输入单输出回归预测
matlab·回归·gru
软件算法开发1 天前
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
matlab·机器视觉·dijkstra算法·路线规划·平面建筑群地图
生信碱移1 天前
万字长文:机器学习的数学基础(易读)
大数据·人工智能·深度学习·线性代数·算法·数学建模·数据分析