BP神经网络 matlab

 

 

mapminmax:归一化函数,将数据归一到指定的区间范围内。

newff:创建一个前向的反馈神经网络

 train:对网络进行训练和学习

sim:对训练好的网络进行仿真和模拟预测


 BP神经网络代码

 

I. 清空环境变量

clear all
clc

II. 训练集/测试集产生

1. 导入数据

load spectra_data.mat

数据在matlab找过你有两种NIR和octare,NIR保存的是特征集合,一共有60*401个数据,octare保存的是输出的值。

NIR:

octare:

 

2. 随机产生训练集和测试集

temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);

temp = randperm(size(NIR,1));%随机产生1~60的随机数,size(NIR,1)指的是NIR中第一列的个数60个。

P_train = NIR(temp(1:50),:)';%取temp中的前50个数据作为NIR的序号,产生训练集,每次运行训练集可能都不一样。

P_train和T_train要保证列是一样的,所以需要对矩阵转置,保证都是50列。

size(A,n)

       如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的是矩阵A的行数, c=size(A,2) 该语句返回的是矩阵A的列数。

 

III. 数据归一化

[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);

 

IV. BP神经网络创建、训练及仿真测试

1. 创建网络

net = newff(p_train,t_train,9);

2. 设置训练参数

net.trainParam.epochs = 1000;%迭代次数
net.trainParam.goal = 1e-3;%MSE 训练目标
net.trainParam.lr = 0.01;%学习速率

3. 训练网络

net = train(net,p_train,t_train);

 

点击“Performance”

 

 解释:通过6次迭代训练的过程,均方误差下降的一个过程。train是训练时mse变化的结果,validation是交叉验证。

 训练的过程。分别为梯度、mu、交叉验证失败的次数。

回归的结果:训练结果几乎都是在一条线上,说明训练非常棒。

 

4. 仿真测试

t_sim = sim(net,p_test);

 返回10个样本的预测值,但是是归一化的结果,结果都是【0,1】,所以需要反归一化。

5. 数据反归一化

T_sim = mapminmax('reverse',t_sim,ps_output);

 

这个是最终预测的值。

 

V. 性能评价

1. 相对误差error

error = abs(T_sim - T_test)./T_test;

 相对误差=|预测值-测试值|/测试值

2. 决定系数R^2

R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));

计算出的结果为:

 

 

3. 结果对比

result = [T_test' T_sim' error']
result =

   88.1000   88.3096    0.0024
   85.2500   88.3216    0.0360
   88.2500   89.0322    0.0089
   87.2000   87.5879    0.0044
   87.6000   87.2667    0.0038
   84.6000   84.4753    0.0015
   87.9000   88.2888    0.0044
   88.7000   88.3545    0.0039
   88.3500   88.6388    0.0033
   88.4000   88.6844    0.0032

 三列分别为真实值、预测值和真实值与预测值之间的误差

VI. 绘图

figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]};
title(string)

 

 

 

可以使用遗传算法对BP神经网络初始的权值和阈值进行优化。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值