神经网络作业(函数逼近)
智能控制理论及应用作业
1资料查询
BP 神经网络的主要应用:
人脸识别、风电功率预测、短时交通流混沌预测、高炉熔渣粘度预测、汇率预测、价格预测、函数逼近等
Rbf神经网络的主要应用:
函数逼近、短时交通流预测、模式识别、降水预测、民航客运量预测、遥感影像分析、声纹识别、语言识别、人脸识别、车牌识别、汇率预测
Hopfield网络应用:
车牌识别、图像识别、遥感影像分类、字母识别、交通标志识别、优化计算中的应用、联想记忆存储器的实现、
2 BP编程算法:
T=[1 1 1 ;1 1 1];
%X=-1:0.1:1; %输入范围
%T=sin(pi*X);
%X=[]
q=3; %隐含层的节点数自己定义,在此给3个
%初始化
[M,N]=size(X); %输入节点个数为M,N为样本数
[L,N]=size(T); %输出节点个数为L
wij=rand(q,M); %先给定加权系数一组随机值
wki=rand(L,q);
wij0=zeros(size(wij)); %加权系数矩阵的初始值
wki0=zeros(size(wki));
for epoch=1:max_epoch %计算开始
NETi=wij*X; %各个隐含层的净输入
for j=1:N
for i=1:q
Oi(i,j)=2/(1+exp(-NETi(i,j)))-1; %再输入作用下,隐含层的输出
end
end
NETk=wki*Oi; %各个输出层的净输入
for i=1:N
for k=1:L
Ok(k,i)=2/(1+exp(-NETk(k,i)))-1; %在输入作用下,输出层的输出
end
end
E=((T-Ok)'*(T-Ok))/2; %性能指标函数,就是误差
if(E<error_goal)
break; %判断是否满足
误差,满足的话就直接跳出计算
%不满足的话,就要修正加权系数
else
deltak=Ok.*(1-Ok).*(T-Ok); %计算△k
w=wki;
wki=wki+lr*deltak*Oi'+a*(wki-wki0);
wki0=w;
deltai=Oi.*(1-Oi).*(deltak'*wki)'; %计算△i
w=wij;
wij=wij+lr*deltai*X'+a*(wij-wij0);
wij0=w;
end
epoch
%当前是第多少步
X1=X; %保护当前的输入
NETi=wij*X1; %再一次计算隐含层的输入输出
for j=1:N
for i=1:q
Oi(i,j)=2/(1+exp(-NETi(i,j)))-1; %
end
end
NETk=wki*Oi; %再一次计算输出层的输出
for i=1:N
for k=1:L
Ok(k,i)=2/(1+exp(-NETk(k,i)))-1;
end
end
%直到误差满足要求才跳到此步,输出修正的输出值
Oi %
Ok %最终满足误差要求下的输出
wij %输出输入层与隐含层的最终修改后的权值
wki %输出隐含层与输出层之间的取值end
仿真结果:
epoch = 8
Oi =
0.9690 -0.4804 0.9995
0.9995 0.9244 0.9989
0.9734 0.9991 0.9356
Ok =
1.0000 1.0000 1.0000
0.9982 0.9658 0.9981
wij =
3.5796 2.0282 2.5985
5.3497 -0.4644 2.5773
5.5337 -0.4516 -1.6788
wki =
1.5490 6.1430 5.8803
2.0593 1.3288
3.8144
由仿真结果可以看出,网络在第八步就可以得到满足误差函数的输出,输出时OK。
由于初始权值是随机给定的,因此每次运行结果可能有所差异。
2.2用BP网路逼近sin函数:
function [ output_args ] = BP1( input_args ) %UNTITLED Summary of this function goes here % Detailed explanation goes here
%P=[0 1 2 3 4 5 6 7 8 9 10];
%T=[0 1 2 3 4 3 2 1 2 3 4];
P=-1:0.1:1; %输入范围
T=sin(pi*P); %样本值
net=newff([0
10],[5,1],{'tansig','purelin'}); %建立网络
%net=newff([0
10],[5,1],{'tansig','purelin'},'traingd', 'learngd','msereg');
%net=newff([0
10],[5,1],{'tansig','purelin'},'traingdx'
,'learngd','msereg');
net.trainParam.epochs=200; %训练步长为200
net=train(net,P,T); %开始训练 figure;
Y=sim(net,P); %输入下网络的输出
plot(P,T,'+',P,Y,'o') %将样本与实际输出作图显示
end
逼近结果:
-1-0.8-0.6-0.4-0.200.20.40.60.81-1.5-1
-0.5
0.5
1
1.5
其中+为目标值,O为实际输出值,从逼近小姑来看,效果还是比较理想的。
3 GUI作业:
MATLAB工具箱中常用的几类函数:
前向网络创建函数:
newcf 创建级联前向网络
newff 创建前向BP网络
newffd 创建存在输入延迟的前向网络
传递函数:
logsig S型的对数函数
dlogsig logsig的导函数
tansig S型的正切函数
dtansig tansig的导函数
purelin 纯线性函数
dpurelin purelin的导函数
学习函数:
learngd 基于梯度下降法的学习函数learngdm 梯度下降栋梁学习函数
训练函数:
trainbrBayes 规范化BP训练函数
trainc 循环顺序渐增训练函数
traincgb Powell-Beale连接梯度BP训练函数
traincgf Fletcher-Powell连接梯度BP训练函数
traincgp Polak-Ribiere连接梯度BP训练函数
traingda 自适应lrBP的梯度递减训练函数traingdx 动量及自适应lrBP的梯度递减训练函数
trainlm Levenberg-Marquardt BP训练函数trainoss 一步正切BP训练函数
trainr 随机顺序递增更新训练函数
trainrp 带反弹的BP训练函数
trains 顺序递增BP训练函数
trainscg 量化连接梯度BP训练函数
性能函数:
mse 均方误差函数
msereg 均方误差规范化函数
显示函数:
plotperf 绘制网络的性能
plotes 绘制一个单独神经元的误差曲面plotep 绘制权值和阈值在误差曲面的位置errsurf 计算单个神经元的误差曲面
GUI的应用:
我选择的是建立BP网络逼近sin 函数
首先在MATLAB主窗口输入nntool即可进入神经网络工具箱点击下方的creat network or data即可进行输入、目标输出及网络的选择。
1首先输入一个输入X:[-1:0.1:1];
再输入期望输出T:[sin(pi*(-1:0.1:1))];
2然后建立BP网络如下图所示:
命名为BP1
选取网络形式中选择:前馈BP网络,输入选择X,期望输出选择T,
训练函数选
择:TRAINLM(Levenberg-Marquardt BP训练函数)
学习函数选择:LEARNGD(基于梯度下降法的学习函数)
误差计算函数选择MSE(均方误差函数),
神经元传输函数选择:TANSIG( S型的正切函数)
单击creat即可建立网络。
3建立好后进行训练
进入训练界面,选择输入和期望输出,即可进行训练。
训练结果如下:
性能如下所示:
可以看出,当系统训练6步时,系统输出即可满足性能要求,此时停止训练。
再此图,我们可以清楚的看清系统的期望输出、实际输出和二者的误差。
从误差可以看出,逼近的sin函数误差是很小的。
同理可利用RBF网络逼近SIN 函数建立网络如图所示:
训练结果如下图所示:
此图显示了利用RBF网路逼近sin函数,总共进行了27步逼近,最后的误差要优于BP网络。
原理清晰之后,可进行多种神经网络的训练,比较不同算法以及不同训练规则及误差计算函数不同对逼近效果的影响,优于时间关系,在此不一一罗列。