数学建模的神经网络

  数学建模中常常用到神经网络,下面我讲一下我通过网络的资料以及相关书籍的知识说认识到的神经网络。

  神经网络(Neural Network,NN),在机器学习和认识科学领域,是一种模仿生物神经网络的结构和功能的数学模型和计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算,具有学习功能,是一种非线性的统计性数据建模工具。

  人工神经元模型

 

  人工神经元模型由三个基本要素构成:

(i)一组连接,连接强度由各个连接上的权值表示,权值正表示激活,权值为负表示抑制。

(ii)一个求和单元,用于求取各输入信号的加权和,这个是线性组合。

(iii)一个非线性的激活函数,起非线性映射作用并将神经元的输出幅度限制在一定范围里。

  人工神经元就是将输入向量与权向量的内积后,经过一个非线性传递函数得到一个标量的结果。

  神经网络分类:根据网络结构及工作方式可以将其分为两种连接方式:

(i)前馈型网络

  各神经元接受前一层的输入,并且输出给下一层,没有反馈。节点分为两类:计算单元和输入单元。每一层计算单元有任意个输入,但是只有一个输出。

  一种常见的多层结构的前馈网络(Multilayer Feedforward Network)由三部分组成,

  • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入消息。输入的消息称为输入向量。
  • 输出层(Output layer),消息在神经元链接中传输、分析、权衡,形成输出结果。输出的消息称为输出向量。
  • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。隐层可以有一层或多层。隐层的节点(神经元)数目不定,但数目越多神经网络的非线性越显著,从而神经网络的强健性(控制系统在一定结构、大小等的参数摄动下,维持某些性能的特性)更显著。习惯上会选输入节点1.2至1.5倍的节点。

这种网络一般称为感知器(对单隐藏层)或多层感知器qi(对多隐藏层)。

(ii)反馈型网络

  所有节点都是计算单元,同时可以接受输入与输出。

  下面利用蠓虫分类问题来具体介绍一下神经网络。

  蠓虫分类问题可概括叙述如下:生物学家试图对两种蠓虫(Af 与 Apf)进行鉴别,
依据的资料是触角和翅膀的长度,已经测得了 9 支 Af 和 6 支 Apf 的数据如下:

  Af:(1.24,1.27),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),(1.48,1.82),(1.54,1.82),(1.56,2.08).
  Apf:(1.14,1.82),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
(i)根据如上资料,如何制定一种方法,正确地区分两类蠓虫。
(ii)对触角和翼长分别为 (1.24,1.80),(1.28,1.84) 与 (1.40,2.04) 的 3 个标本,用所得到的方法加以识别。

  利用BP神经网络可得代码:

p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90; 
 1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08]; 
p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00 
 1.28,2.00;1.30,1.96]; 
p=[p1;p2]'; 
pr=minmax(p); 
goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)]; 
plot(p1(:,1),p1(:,2),'h',p2(:,1),p2(:,2),'o') 
net=newff(pr,[3,2],{'logsig','logsig'});  
net.trainParam.show = 10;         
net.trainParam.lr = 0.05;  
net.trainParam.goal = 1e-10;      
net.trainParam.epochs = 50000;    
net = train(net,p,goal);          
x=[1.24 1.80;1.28 1.84;1.40 2.04;]'; 
y0=sim(net,p); 
y=sim(net,x);

 运行结果以及散点图如下:

 

 从y的值不难看出结论,(1.24,1.80)预测为APF,(1.28,1.84)也为APF,而(1.40,2.04)则为PF.

 下面看另外一个例题:利用神经网络研究下列函数的逼近值:

 y=1/x( 1=<x<=100)

x = linspace(1.5, 99.5,98);
y = 1 ./ x;
hiddenLayerSize = 10;%10个隐藏输出元
net = feedforwardnet(hiddenLayerSize);
net = train(net, x, y);
x_new = 100;
y_new = net(x_new);
x1_new=1;
y1_new=net(x1_new);
plot(x, y, 'b');
hold on;
plot(x_new, y_new,x1_new,y1_new, 'go');
legend('真实值', '预测值', '新输入预测值');

运行结果如下:

 表示对y=1/x函数分别在x=1和x=100的时候,神经网络跑出来的结果分别为0.8711和0.0101,可以看出与实际有一定的误差。