计算智能——BP神经网络和感知器的简单应用

神经网络基本原理

人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则,在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。

1.人工神经元模型

人工神经元模型
图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值 ( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为:
神经元输入输出表达式
  图中 yi表示神经元i的输出,函数f称为激活函数,net称为净激活。
  若神经元的neti为正,称该神经元处于激活状态或兴奋状态,若neti为负,则称神经元处于抑制状态。

2.BP神经网络模型:前馈式

前馈网络也称前向网络。这种网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到到达输出层,层间没有向后的反馈信号,因此被称为前馈网络。感知机与BP神经网络就属于前馈网络。
如下是一个3层的前馈神经网络,其中第一层是输入单元,第二层称为隐含层,第三层称为输出层。
前馈式神经网络1前馈式神经网络2
设网络输入为x,则隐含层第j个节点输入为:
隐含层第j个节点输入
输出层第k个节点输入为:输出层输入
输出层第k个节点输出为:输出层输出

3.BP神经网络训练过程

网络学习的目的就是根据训练数据的误差E对于各个参数的梯度,求解参数调整量
神经网络结构:
神经网络结构
参数调整量:
训练结果

4.BP神经网络算法

输入:网络结构参数(层数、节点数等);训练的数据集
输出:网络权值与阈值
1.网络权值初始化
2.对输入训练S={(x1,t1),(x2,t2),…,(xK,tK)},依次通过输入层、隐含层、输出层,分别计算误差E
3.通过误差E反传计算每一个神经元的误差信号
4.根据误差信号调整网络权值W和节点阈值b
5.对训练数据不断迭代,直至最大迭代次数或误差低于某一阈值为止
(训练过程可采用随机梯度下降和批量梯度下降)

BP神经网络的实现

1.代码

% BP网络
% BP神经网络的构建
net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
net.IW{1}
net.b{1}

p=[1;2];
a=sim(net,p)
net=init(net);
net.IW{1}
net.b{1}
a=sim(net,p)
%net.IW{1}*p+net.b{1}
p2=net.IW{1}*p+net.b{1}
a2=sign(p2)
a3=tansig(a2)
a4=purelin(a3)
net.b{2}
net.b{1}

net.IW{1}
net.IW{2}
0.7616+net.b{2}
a-net.b{2}
(a-net.b{2})/ 0.7616
help purelin

p1=[0;0];
a5=sim(net,p1)
net.b{2}
% BP网络
% BP神经网络的构建
net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
net.IW{1}
net.b{1}
%p=[1;];
p=[1;2];
a=sim(net,p)
net=init(net);
net.IW{1}
net.b{1}
a=sim(net,p)
net.IW{1}*p+net.b{1}
p2=net.IW{1}*p+net.b{1}
a2=sign(p2)
a3=tansig(a2)
a4=purelin(a3)
net.b{2}
net.b{1}

P=[1.2;3;0.5;1.6]
W=[0.3 0.6 0.1 0.8]
net1=newp([0 2;0 2;0 2;0 2],1,'purelin');
net2=newp([0 2;0 2;0 2;0 2],1,'logsig');
net3=newp([0 2;0 2;0 2;0 2],1,'tansig');
net4=newp([0 2;0 2;0 2;0 2],1,'hardlim');

net1.IW{1}
net2.IW{1}
net3.IW{1}
net4.IW{1}
net1.b{1}
net2.b{1}
net3.b{1}
net4.b{1}

net1.IW{1}=W;
net2.IW{1}=W;
net3.IW{1}=W;
net4.IW{1}=W;

a1=sim(net1,P)
a2=sim(net2,P)
a3=sim(net3,P)
a4=sim(net4,P)

init(net1);
net1.b{1}

help tansig

% 训练
p=[-0.1 0.5]
t=[-0.3 0.4]
w_range=-2:0.4:2;
b_range=-2:0.4:2;

ES=errsurf(p,t,w_range,b_range,'logsig');%单输入神经元的误差曲面
plotes(w_range,b_range,ES)%绘制单输入神经元的误差曲面
pause(0.5);
hold off;
net=newp([-2,2],1,'logsig');
net.trainparam.epochs=100;
net.trainparam.goal=0.001;
figure(2);
[net,tr]=train(net,p,t);
title('动态逼近')
wight=net.iw{1}
bias=net.b
pause;
close;
% 练
p=[-0.2 0.2 0.3 0.4]
t=[-0.9 -0.2 1.2 2.0]
h1=figure(1);
net=newff([-2,2],[5,1],{'tansig','purelin'},'trainlm');
net.trainparam.epochs=100;
net.trainparam.goal=0.0001;
net=train(net,p,t);
a1=sim(net,p)
pause;
h2=figure(2);
plot(p,t,'*');
title('样本')
title('样本');
xlabel('Input');
ylabel('Output');
pause;
hold on;
ptest1=[0.2 0.1]
ptest2=[0.2 0.1 0.9]
a1=sim(net,ptest1);
a2=sim(net,ptest2);

net.iw{1}
net.iw{2}
net.b{1}
net.b{2}

2.部分代码解释

1 net=newff([-1 2;0 5],[3,1],{‘tansig’,‘purelin’},‘traingd’)
(1)newff函数语法语法:net = newff ( A, B, {C} ,‘trainFun’)
参数:A:一个n×2的矩阵,第i行元素为输入信号xi的最小值和最大值;
B:一个k维行向量,其元素为网络中各层节点数;
C:一个k维字符串行向量,每一分量为对应层神经元的激活函数;
trainFun :为学习规则采用的训练算法。
(2)常用的激活函数
a) 线性函数 f(x) = x
  该函数的字符串为’purelin’
b) 对数S形转移函数
该函数的字符串为’logsig’
c) 双曲正切S形函数
   该函数的字符串为’ tansig
(3)常见的训练函数
traingd :梯度下降BP训练函数
traingdx :梯度下降自适应学习率训练函数
这里A对应一个2行2列的矩阵,有两个输入信号,x1的最小值为-1,最大值为2,x2的最小值为0,最大值为5;
B对应一个2维行向量,表示第一层有3个节点,第二层有1个节点;
C表示第一层神经元的激活函数为双曲正切S形函数,第二层神经元的激活函数为线性函数;
训练算法为梯度下降BP训练函数。

2 net.IW{1}
net.b{1}
权值/阈值
net.iw % 权值元包:net.iw{1}:当网络只有一层时,net.iw是一个1x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值