回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

预测效果

1
2

3
4
5
6
7

基本介绍

MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测,输出为选择的特征序号
Chinese:
Options:可用的选项即表示的涵义如下
  -s svm类型:SVM设置类型(默认0)
  0 – C-SVC
  1 --v-SVC
  2 – 一类SVM
  3 – e -SVR
  4 – v-SVR
  -t 核函数类型:核函数设置类型(默认2)
  0 – 线性:u’v
  1 – 多项式:(ru’v + coef0)^degree
  2 – RBF函数:exp(-r|u-v|^2)
  3 –sigmoid:tanh(r
u’v + coef0)
经过特征选择后,保留特征的序号为:
126 160 161 163 165 166 237 239 240 370
评价结果如下所示:
平均绝对误差MAE为:0.27933
均方误差MSE为: 0.15813
均方根误差RMSEP为: 0.39765
决定系数R^2为: 0.93392
剩余预测残差RPD为: 4.2631
平均绝对百分比误差MAPE为: 0.0032299

研究内容

基于SVM-RFE-BP的特征选择算法结合BP神经网络的多输入单输出回归预测是一种结合了支持向量机递归特征消除(SVM-RFE)和反向传播(BP)神经网络的方法。下面是算法的基本步骤:
数据准备:准备包含多个输入特征和一个输出变量的训练数据集。确保数据集已经进行了预处理和标准化。
特征选择:使用SVM-RFE算法对输入特征进行排序和选择。SVM-RFE是一种递归特征消除算法,它通过反复训练支持向量机(SVM)模型,并剔除最不重要的特征,直到达到指定的特征数量或达到某个停止准则。
特征提取:使用SVM-RFE选择的特征作为输入,从训练数据集中提取这些特征。
神经网络构建:构建一个BP神经网络模型,该模型具有适当的输入层、隐藏层和输出层。输入层的节点数量应与选择的特征数量相同,输出层的节点数量为1。
神经网络训练:使用特征提取的数据作为输入,将输出变量作为目标,对BP神经网络进行训练。使用反向传播算法来更新网络的权重和偏置,以最小化预测输出与实际输出之间的误差。
预测:使用训练好的BP神经网络模型对新的输入特征进行预测。将这些特征输入到训练好的神经网络中,得到对应的输出。
这种基于SVM-RFE-BP的方法可以结合支持向量机的特征选择能力和神经网络的非线性建模能力,提高回归预测的性能和准确性。然而,需要注意的是,该方法的效果取决于数据集的特征和特征选择的参数设置,因此在实际应用中需要进行适当的调优和验证。

程序设计

%%  输出选择特征的对应序号
disp('经过特征选择后,保留特征的序号为:')
disp(save_index)

%%  特征选择后的数据集
p_train = p_train(:, save_index);
p_test  = p_test (:, save_index);

%%  矩阵转置适应模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';

%%  创建网络


%%  设置训练参数
net.trainParam.epochs = 1000;  % 最大迭代次数


%%  仿真测试
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test );

%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);

%% 测试集结果
figure;
plotregression(T_test,T_sim2,['回归图']);
figure;
ploterrhist(T_test-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));
%%  训练集绘图
figure
%plot(1:M,T_train,'r-*',1:M,T_sim1,'b-o','LineWidth',1)
plot(1:M,T_train,'r-*',1:M,T_sim1,'b-o','LineWidth',1.5)
legend('真实值','SVM-RFE预测值')
xlabel('预测样本')
ylabel('预测结果')

%% 预测集绘图
figure
plot(1:N,T_test,'r-*',1:N,T_sim2,'b-o','LineWidth',1.5)
legend('真实值','SVM-RFE预测值')
xlabel('预测样本')
ylabel('预测结果')


%% 测试集误差图
figure  
ERROR3=T_test-T_sim2;
plot(T_test-T_sim2,'b-*','LineWidth',1.5)

%% 绘制线性拟合图
%% 训练集拟合效果图
figure
plot(T_train,T_sim1,'*r');
xlabel('真实值')
ylabel('预测值')

title(string)
hold on ;h=lsline;
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 预测集拟合效果图
figure
plot(T_test,T_sim2,'ob');
xlabel('真实值')
ylabel('预测值')
string1 = {
    
    '测试集效果图';['R^2_p=' num2str(R2)  '  RMSEP=' 
set(h,'LineWidth',1,'LineStyle','-','Color',[1 0 1])
%% 求平均
R3=(R1+R2)./2;
error3=(error1+error2)./2;
%% 总数据线性预测拟合图
tsim=[T_sim1,T_sim2]';
S=[T_train,T_test]';
figure
plot(S,tsim,'ob');
xlabel('真实值')
ylabel('预测值')

参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/128577926?spm=1001.2014.3001.5501
[2] https://blog.csdn.net/kjm13182345320/article/details/128573597?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/kjm13182345320/article/details/132122445