目录
一、BP神经网路基本原理
1-神经网络的简单介绍
2-神经网络模型
3-BP神经网络基本原理
4-神经网络的应用
二、BP神经网络编程实践
1-神经网络应用于分类问题的编程实例
2-神经网络应用于预测问题的编程实例
一、BP神经网路基本原理
1-神经网络的简单介绍
神经网络就是构建输入和输出的一个关系,而这个关系不能通过先验经验进行构建,神经网路通过一个黑箱的关系构建输入和输出的关系,黑箱的关键在于连接权的构建,神经网络一般包含三层,输入层,隐藏层,输出层,输出数据由标准输出数据和实际输出数据,我们需要对神经网络进行训练,训练过程就是通过调整连接权减少输出数据和标准数据之间的误差。神经网络可以用在数学建模的评价,预测,拟合,以及其它工业、经济各个领域。
一个神经网络一般由三层组成,即输入层,隐藏层和输出层;输入层一般由一个个神经元组成,隐藏层是很必要的。
y和x尽建立一种权关系,权重可以调整,不用假设y与x的具体关系,神经网络相当于黑箱模型。 对于阈值,就是临界值,能够让大脑产生刺激的最低信号值。
2-神经网络模型
前馈:容易造成误差,自组织:容易产生混乱,反馈神经网路:相对好一些。
3-BP神经网络基本原理
我们可以知道:输入神经元的输入是固定的,神经元的数量与处理方式也是固定,标准输出是固定,阈值也往往是固定,就是权值是不固定的,只要权值构建好,结果就会好。
对于每次输入后,经过激活函数激活后输出,具体如下所示:
我们最终是想知道误差取得最小值的时候,我们的权值的取值是多少。只需要误差对权值求导,找到导数等于0的点。
4-神经网络的应用
二、BP神经网络编程实践
1-神经网络应用于分类问题的编程实例
根据聚类思想,进行划分,画一条直线进行区分。
但是大多数情况,一条直线很难区分数据的类别。
下面的新思路就可以通过神经网络模型进行构建:
通过下表我们可以看到输入包含两个数据,即翼长和触角长,输入数据是15个,故输入数据P的维度是2*15,需要转置一下,输出数据t的维度是1*15,也需要转置一下。
上述分类问题的神经网络MATLAB代码如下所示:
clear; clc
P = [1.78, 1.96, 1.86, 1.72, 2, 2, 1.96, 1.74, 1.64, 1.82, 1.9, 1.7, 1.82, 1.82, 2.08;
1.14, 1.18, 1.2, 1.24, 1.26, 1.28, 1.3, 1.36, 1.38, 1.38, 1.38, 1.40, 1.48, 1.54, 1.56] ;
T = [0.9, 0.9, 0.9, 0.1, 0.9, 0.9, 0.9, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] ;
%利用minmax函数求输入样本范围
net = newff(minmax(P),[7,1],{'tansig','purelin'},'trainlm');
net.trainParam.show=50; %每次循环50次
net.trainParam.epochs=10000;%最大循环10000次
net.trainParam.goal=0.01; %期望目标误差最小值
[net,tr]=train(net,P,T);%对网络进行反复训练
%对已知样本通过训练好的模型进行预测
Y = sim(net, P) ;
disp('输出预测的类别,靠近0.1的为Af类,靠近0.9的为Apf类:') ;
disp(Y) ;
%用训练好的模型进行预测
p = [1.3; 1.2] ;
s = sim(net, p) ;
disp('对翼长为1.3,触角长为1.2的进行类别预测:') ;
disp(s) ;
2-神经网络应用于预测问题的编程实例
如下表预测问题,我们可以考虑一下怎么构建神经网络,让1,2,3月作为输入,4月的作为输出,2,3,4作为输入,5月份作为输出,依次类推。我们利用销量自身建立关系,而不是销量和月份建立关系。
前8个月的作为输入输出数据,输入数据3*6维,输出数据1*6维,进行训练,后面几个月作为预测数据进行预测。
上述预测过程的MATLAB代码如下所示:
clear; clc
P = [2056, 2395, 2600; 2395, 2600, 2298; 2600, 2298, 1634; 2298, 1634, 1600; 1634, 1600, 1873; 1600, 1873, 1478] ;
T = [2298, 1634, 1600, 1873, 1487, 1900] ;
P = P' ;
ma = max(max(P)) ;
mi = min(min(P)) ;
%数据归一化到0-1之间
T = (T - min(min(P))) ./ (max(max(P)) - min(min(P))) ;
P = (P - min(min(P))) ./ (max(max(P)) - min(min(P))) ;
net = newff([0,1;9,1;0,1],[7,1],{'tansig','logsig'},'traingd');
net.trainParam.show=50; %每次循环50次
net.trainParam.epochs=15000;%最大循环15000次
net.trainParam.goal=0.01; %期望目标误差最小值
[net,tr]=train(net,P,T);%对网络进行反复训练
%用原始数据做仿真
y = sim(net, P) ;
disp(y) ;
disp('4-9月份的预测结果为:') ;
y1 = y .* (ma - mi) + mi ;
disp(y1) ;
%输入9,10,11月份的数据,对12月份的数据进行预测
p = [1900, 1500, 2046] ;
p = p' ;
p = (p - mi) ./ (ma - mi) ;
r = sim(net, p) ;
disp('12月份的预测结果:') ;
disp(r) ;
disp('12月份反归一化后的结果如下:') ;
r1 = r * (ma - mi) + mi ;
disp(r1) ;
总结一下吧:对于构建输入和输出关系的情况,并且数据量比较大的情况下的非线性拟合,我们可以考虑使用神经网络。
神经网络在数学建模中一般用于分类,评价,预测类问题。
神经网络编程步骤:
1)寻找对结果产生影响的各种指标,假设有m个;
2)寻找样本n个,构造矩阵m*n,其对应的标准输出是n*1;
3) 将上述m*n与n*1分别带入网络中训练;
4)输入新的数据进行仿真。