基于CNN-RVM的数据回归预测

文摘   2024-07-26 11:31   湖南  


代码原理

基于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');                    % 画出曲线

代码效果图








下载链接:https://mbd.pub/o/bread/ZpiXm5hu
或点击阅读原文

MATLAB科研小白
信号处理方向在校博士研究生,目前专研于MATLAB算法及科学绘图等,熟知各种信号分解算法、神经网络时序预测算法、数据拟合算法以及滤波算法。提供一个可以相互学习相互进步的平台
 最新文章