代码原理
基于CNN-SVM的数据回归预测是一种结合卷积神经网络(CNN)和支持向量机(SVM)的混合模型,用于处理和预测时间序列数据或其他具有时序特征的数据。以下是该方法的简单原理及流程:
原理
(1)卷积神经网络(CNN):
特征提取:CNN主要用于从输入数据中提取局部特征。通过多个卷积层和池化层,CNN可以有效地捕捉数据中的重要模式和特征。
(2)支持向量机(SVM):
回归任务:SVM在回归任务中通常用于拟合数据并预测连续值。它通过找到在特征空间中能够划分不同类别的最优超平面来工作,这个概念可以扩展到回归问题中。
流程
(1)数据准备:
数据收集:收集所需的时间序列数据或具有时序特征的数据,确保数据完整性和准确性。
数据预处理:包括数据清洗、归一化,并将数据分割成训练集和测试集等步骤。
(2)构建模型:
输入层:将预处理后的数据输入模型。
卷积层:使用多个卷积层从输入数据中提取局部特征。每个卷积层之后可能会接一个池化层,以减少特征维度,降低计算复杂度。
特征提取:从卷积层输出的特征图中提取有意义的特征向量。
(3)支持向量机回归:
特征向量输入:将卷积层提取的特征向量作为SVM的输入。
模型训练:使用训练集训练SVM模型,调整模型参数以最小化预测误差。
(4)模型评估:
测试集评估:使用测试集评估模型的预测性能,通常使用均方误差或其他回归指标来评估模型的准确性和泛化能力。
(5)预测和应用:
实际预测:将新数据输入训练好的模型,使用SVM进行回归预测。
应用场景:根据具体应用需求,将预测结果用于实际业务决策或其他相关领域。
通过结合CNN的特征提取能力和SVM的回归预测能力,该混合模型可以有效地处理具有时序特征的数据,并提供精确的回归预测结果。
部分代码
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc
addpath(genpath(pwd))
%% 导入数据
data = readmatrix('回归数据集.xlsx');
data = data(:,1:14);
res=data(randperm(size(data,1)),:); %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
num_samples = size(res,1); %样本个数
% 训练集和测试集划分
outdim = 1; % 最后一列为输出
num_size = 0.7; % 训练集占数据集比例
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim; % 输入特征维度
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
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);
%% 数据平铺
trainD = double(reshape(p_train,size(p_train,1),1,1,size(p_train,2)));
testD = double(reshape(p_test,size(p_test,1),1,1,size(p_test,2)));
targetD = t_train;
targetD_test = t_test;
% 创建CNN网络,
layers = [
imageInputLayer([size(p_train,1) 1 1], "Name","sequence")
convolution2dLayer([3,1],16,'Padding','same') % 卷积核大小为3*1 生成16个卷积
batchNormalizationLayer % 批归一化层
reluLayer %relu激活函数
maxPooling2dLayer([2 1],'Stride',1, "Name", "pool1") % 最大池化层 大小为3*1 步长为1
convolution2dLayer([2 1], 32, "Name", "conv_2") % 卷积核大小为2*1 生成32个卷积
batchNormalizationLayer % 批归一化层
reluLayer % relu激活层
maxPooling2dLayer([2 1],'Stride',1, "Name", "pool2") % 最大池化层 大小为2*2 步长为2
fullyConnectedLayer(25) % 全连接层神经元
reluLayer %relu激活函数
fullyConnectedLayer(1) % 输出层神经元
regressionLayer];%添加回归层,用于计算损失值
% 参数设置
options = trainingOptions('adam', ... % 优化算法Adam
'MaxEpochs', 150, ... % 最大训练次数
'GradientThreshold', 1, ... % 梯度阈值
'InitialLearnRate', 0.01, ... % 初始学习率
'LearnRateSchedule', 'piecewise', ... % 学习率调整
'LearnRateDropPeriod', 70, ... % 训练850次后开始调整学习率
'LearnRateDropFactor',0.1, ... % 学习率调整因子
'L2Regularization', 0.001, ... % 正则化参数
'ExecutionEnvironment', 'cpu',... % 训练环境
'Verbose', 1, ... % 关闭优化过程
'Plots', 'none'); % 画出曲线