神经网络与MATLAB 1 BP神经网络

Posted 尚墨1111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络与MATLAB 1 BP神经网络相关的知识,希望对你有一定的参考价值。

一、写在前面

神经网络的分类
按连接方式分:前向神经网络和反馈神经网络
按学习方式分:有导师学习和无导师学习
按功能分:拟合网络和预测网络

二、理论基础

1、BP= Backpropagation,反向传播的算法,属于有导师学习,要求激活函数必须是可导可微分的。

2、学习算法:

正向传播,按公式计算输出值 y
比较输出值与预期值的误差 z-y
误差反馈通知神经元,按公式沿梯度下降方向进行权值更新
循环往复,直至误差足够小

3、归一化

将数据映射到指定区间(0,1)或者(-1,1)
数据大可能会导致神经网络收敛慢、训练时间长
数据大的输入在模式分类中的作用会偏大,小的会偏小。
而激活函数sigmoid函数在(0,1)范围之外的差别非常小,数据大没有任何意义。

三、根据程序来进行分析

clear all
clc
load spectra_data.mat
temp = randperm(size(NIR,1));
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51: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);
net = newff(p_train,t_train,9);
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
net = train(net,p_train,t_train);
t_sim = sim(net,p_test);
T_sim = mapminmax('reverse',t_sim,ps_output);
error = abs(T_sim - T_test)./T_test;
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)); 
result = [T_test' T_sim' error']
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = '测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)];
title(string)

1、

save mydata  
load mydata           //load('mydata.mat')

生成数据的 .mat 文件
读取mat文件所有数据,首先是将你想打开的mat文件所在的目录设置为当前工作目录,就会将mydata中的所有数据加载到当前工作环境中

2、

p = randperm(n)
p = randperm(n,k)

语法描述:
p = randperm(n) 返回一行包含从1到n的整数
p = randperm(n,k) 返回一行从1到n的整数中的k个,而且这k个数也是不相同的。
randperm完成的是不重复的重排采样

3、

temp = randperm(size(NIR,1));         // size(NIR,1)表示输出矩阵NIR的行数 ,生成一行(160)的整数,NIR是60*401的矩阵,
P_train = NIR(temp(1:50),:)';        // a(:,n)为取a矩阵中第n列元素,a(m,:)为取a矩阵中第m行元素
								     // 这里就表示为随机选取NIR数据矩阵的50行元素
								     // 转置的目的,就是要让一列称为一个样本,如果你读取进来的原始样本是以一行为一个样本的,那你必须转置
T_train = octane(temp(1:50),:)';     //同理获取octane,60*1的数据矩阵里的50个元素作为样本
P_test = NIR(temp(51:end),:)';       //选取剩下的数据作为测试集
T_test = octane(temp(51:end),:)';
N = size(P_test,2);                  //把矩阵P_test的列数赋给N

size():获取矩阵的行数和列数
s=size(A),
当只有一个输出参数时,返回一个行向量,该行向量的第一个元素是矩阵的行数,第二个元素是矩阵的列数。
[r,c]=size(A),
当有两个输出参数时,size函数将矩阵的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c。
size(A,n)
如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的时矩阵A的行数, c=size(A,2) 该语句返回的时矩阵A的列数。所以N=size(X,2),就是把矩阵X的列数赋值给N。

4、

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

mapminmax函数的用法:
[Y,PS] = mapminmax(X,ymin,ymax),其中y是对进行规范化后得到的数据,这种规范化的映射记录在结构体ps中,映射函数 其中ymin,和ymax是参数,可以自己设定,默认为-1,1;
y2 = mapminmax(‘apply’,x2,ps),即对x1采用的规范化映射(记录在ps中),对x2也要采取这个映射.

5、

% 1. 创建网络
net = newff(p_train,t_train,9);

% 2. 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;

% 3. 训练网络
net = train(net,p_train,t_train);

% 4. 仿真测试
t_sim = sim(net,p_test);

% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);

newff的用法,net = newff(P,T,[S1 S2…S(N-l)],TF1 TF2…TFNl, BTF,BLF,PF,IPF,OPF,DDF)
P:输入数据矩阵
T:目标数据矩阵
S:隐含层节点数

6、

性能评价
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;      //abs函数是绝对值函数,输出相对误差

% 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']

决定系数,如果相关系数 R=0.66,则决定系数 R^2=0.4356,即该情况约有 44%可由该所测的部分来说明或决定。

四、总结整个过程

1、清空环境
2、载入数据
3、建立随机样本集(训练样本集、测试集)
4、数据归一化
5、生成网络(设置输入、输出、隐藏层,)
6、训练网络(设置训练参数,训练迭代次数、学习率、误差)
7、测试仿真
8、比较、绘画图形

以上是关于神经网络与MATLAB 1 BP神经网络的主要内容,如果未能解决你的问题,请参考以下文章

备战数学建模34-BP神经网络预测2

基于蝙蝠算法优化BP神经网络的数据分类算法及其MATLAB实现-附代码

数据预测基于matlab鸟群算法优化BP神经网络数据预测含Matlab源码 1772期

BP回归预测基于matlab思维进化算法优化BP神经网络回归预测含Matlab源码 2031期

BP回归预测基于matlab思维进化算法优化BP神经网络回归预测含Matlab源码 2031期

神经网络与MATLAB 1 BP神经网络