BP神经网络(基于MATLAB)

clc
clear all

%% 导入数据
load('S_Data.mat')     % 预测S含量所用数据

n = 12;   % n 是自变量的个数
m = 1;    % m 是因变量的个数
%% 读取训练数据
train_num = 1600;  %训练样本数
train_Data = S_Data(1:train_num,:);
% 特征值归一化
[train_Input,minI,maxI] = premnmx(train_Data(:,1:n)');
% 构造输出矩阵
[train_Output,minO,maxO] = premnmx(train_Data(:,n+1:end)');

%% 创建神经网络
% net = newff(P,T,S,TF,BTF,BLF,PF)
% net = newff(P,T,[隐层的神经元的个数,输出层的神经元的个数],{隐层神经元的传输函数,输出层的传输函数},'反向传播的训练函数','学习函数','性能函数')
% P为输入矩阵,T为期望输出矩阵
% TF为神经网络的传输函数,默认为'tansig'函数为隐层的传输函数,purelin函数为输出层的传输函数
% 一般在这里还有其他的传输的函数一般的如下,如果预测出来的效果不是很好,可以调节
% TF1 = 'tansig';TF2 = 'logsig';
% TF1 = 'logsig';TF2 = 'purelin';
% TF1 = 'logsig';TF2 = 'logsig';
% TF1 = 'purelin';TF2 = 'purelin';
TF1='tansig';TF2='purelin';

net = newff( train_Input,train_Output,5,{ TF1,TF2 },'traincgf','learngdm','mse'); 

 %%%%%%%%%% 设置网络参数 %%%%%%%%%%%
%% 权值赋定值
% [m1,n1]=size(net.IW{1,1});
% net.IW{1,1}=0.3*ones(m1,n1);
% [m2,n2]=size(net.LW{2,1});
% net.LW{2,1}=0.3*ones(m2,n2);
%% 权值赋随机值
 %net.layers{1}.initFcn = 'initwb';
% % net.inputWeights{1,1}.initFcn = 'rands';  % 将权值设置为[-1,1]之间的随机数
% % net.biases{1,1}.initFcn = 'rands';    % 将阈值设置为[-1,1]之间的随机数
% % net.biases{2,1}.initFcn = 'rands';    % 将阈值设置为[-1,1]之间的随机数
% % 
% % net.layers{2}.initFcn = 'initwb';
% % net.inputWeights{1,1}.initFcn = 'rands';  % 将权值设置为[-1,1]之间的随机数
% % net.biases{1,1}.initFcn = 'rands';    % 将阈值设置为[-1,1]之间的随机数
% % net.biases{2,1}.initFcn = 'rands';    % 将阈值设置为[-1,1]之间的随机数
% % net = init(net);
% 
 net.trainparam.epochs = 1000;        % 最大迭代次数
  net.trainparam.goal = 1e-5;         % 网络性能函数训练目标值
  net.trainParam.lr = 0.01;           % 学习率
  net.trainparam.mc = 0.95;           % 动量因子
  net.trainparam.show = 10;           % 显示训练迭代过程
  net.trainParam.max_fail = 100;      % 最大确认失败次数
 
% %% 指定训练参数
% % net.trainFcn = 'traingdx'; % 变学习率动量梯度下降算法
% % net.trainFcn = 'trainlm'; %Levenberg-Marquardt算法,内存需求最大,收敛速度最快
% % net.trainFcn = 'trainbr'; % 贝叶斯正则化算法
% % net.trainFcn = 'trainbfg'; %Quasi-Newton Algorithms - BFGS Algorithm,计算量和内存需求均比共轭梯度算法大,但收敛比较快
% % net.trainFcn = 'traingd'; % 梯度下降算法
% % net.trainFcn = 'traingdm'; % 动量梯度下降算法
% % net.trainFcn = 'traingda'; % 变学习率梯度下降算法

% 开始训练
tic;  % 仿真计时开始
 net = train(net,train_Input,train_Output);% BP神经网络训练
BPtrain_Output = sim(net,train_Input );% BP神经网络训练数据预测
toc;   % 仿真计时结束

train_Output = postmnmx(train_Output,minO,maxO);
BPtrain_Output = postmnmx(BPtrain_Output,minO,maxO);
% 训练数据误差
train_err = train_Output - BPtrain_Output;
n1 = length(BPtrain_Output);
train_RMSE = sqrt(sum((train_err).^2)/n1);

%% 读取测试数据
test_Data = S_Data(train_num+1:end,:);
% 特征值归一化
test_Input = tramnmx(test_Data(:,1:n)',minI,maxI);
% 构造测试输出矩阵
test_Output = tramnmx(test_Data(:,n+1:end)',minO,maxO);

%% BP神经网络测试数据预测
BPtest_Output = sim(net,test_Input);
test_Output = postmnmx(test_Output,minO,maxO);
BPtest_Output = postmnmx(BPtest_Output,minO,maxO);
% 测试数据误差
test_err = test_Output - BPtest_Output;
n2 = length(BPtest_Output);
test_RMSE = sqrt(sum((test_err).^2)/n2);

%% 预测结果可视化
figure(1);  % 绘制图1
subplot(2,1,1);  % 图1包含2行1列个子图形,首先绘制子图1
plot(BPtest_Output,':og');  % 用绿色的o绘制测试数据的预测输出值
hold on;
plot(test_Output','-*b');  % 用蓝色的*绘制测试数据的期望输出值
legend('预测输出','期望输出');  % 子图1的注释
title('BP神经网络预测S含量结果','fontsize',12)  %子图1的标题
ylabel('S含量','fontsize',12);  % y轴
xlabel('样本','fontsize',12);  % x轴
subplot(2,1,2);  % 绘制子图2
plot(abs(test_Output - BPtest_Output),'-*');  % 输出测试数据的预测误差
title('BP神经网络预测S含量误差','fontsize',12)  %子图2的标题
ylabel('误差','fontsize',12);  % y轴
xlabel('样本','fontsize',12);  % x轴

猜你喜欢

转载自blog.csdn.net/xq_520/article/details/89284329