代码原理
基于CNN-RVM的数据回归预测主要涉及两个核心部分:卷积神经网络(CNN)和相关向量机(RVM)。下面是一个简单的原理及流程描述:
卷积神经网络(CNN)部分
(1)输入数据:将数据集(例如图像、时间序列等)作为输入。
(2) 卷积层:通过多个卷积层提取数据的局部特征,每个卷积层会应用不同的滤波器,以捕捉不同的特征。
(3)池化层:通过池化层(如最大池化或平均池化)减少数据的维度,同时保留重要特征,减少计算量。
(4)全连接层:经过多个卷积和池化层后,数据被展平并传递到全连接层,用于特征的综合和分类/回归任务。
相关向量机(RVM)部分
(1) 特征提取:将从CNN提取到的特征作为输入,传递给RVM。
(2)模型训练:RVM通过贝叶斯推断,选择一组相关向量,并用这些向量来构建回归模型。
(3)预测输出:训练好的RVM模型对输入特征进行回归预测,输出结果。
流程总结
(1)数据预处理:准备好输入数据,并进行必要的预处理(如归一化、数据增强等)。
(2)CNN特征提取:
① 输入数据通过多个卷积层和池化层,提取到有意义的特征;
② 最后通过全连接层将特征进行综合处理,形成一个特征向量。
(3)RVM回归预测:
① 将CNN输出的特征向量作为RVM的输入。
② 通过RVM训练模型,选出最有用的相关向量,构建回归模型。
③ 使用训练好的RVM模型进行回归预测,得到最终的预测结果。
这个流程结合了CNN强大的特征提取能力和RVM精确的回归预测能力,在处理复杂数据集时具有很好的表现。
部分代码
%% 清空环境变量
warning off % 关闭开启的图窗
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-RVM网络,
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', 100, ... % 训练850次后开始调整学习率
'LearnRateDropFactor',0.1, ... % 学习率调整因子
'L2Regularization', 0.001, ... % 正则化参数
'ExecutionEnvironment', 'cpu',... % 训练环境
'Verbose', 0, ... % 关闭优化过程
'Plots', 'training-progress'); % 画出曲线