智能计算第一次作业hsWord格式.docx
《智能计算第一次作业hsWord格式.docx》由会员分享,可在线阅读,更多相关《智能计算第一次作业hsWord格式.docx(10页珍藏版)》请在冰点文库上搜索。
感知器对单个神经元建模,如果输入的加权和大于某个可调整的阈值就输出1,否则输出0,此即文提到的生物脉冲。
图四中,输入信号(x1,x2,x3..xm)和联接权值(w1,w2,w3..wm)通常是实数值,可正可负。
若xi趋向于使感知器激活,则权值wi为正值,反之为负值。
感知器本身由权值,加法器,激活函数以及可调阈值(以下称
偏置)组成。
通常为了方便起见,将偏置也作为一个输入信号。
单层神经网络(感知器网络)的输出单元是相互独立的-每个权值仅影响一个输出。
感知器网络能用来解决线性分类问题。
感知器的学习规则:
是用来计算新的权值矩阵W及新的偏差B的算法,感知器利用其学习规则来调整网络权值,以便使该网络对输入矢量的响应达到数值为0或1的目标输出。
感知器的训练规则:
在输入矢量P的作用下,计算网络的实际输出A,并与相应的的目标矢量T进行比较,检查A是否等于T,然后用比较后的误差E,根据学习规则进行权值和偏差的调整;
重新计算网络在新权值作用下的输入,重复权值调整过程,直到网络的输出A等于目标矢量T或训练次数达到事先设置的最大值时训练结束。
若网络训练成功,那么训练后的网络在网络权值的作用下,对于被训练的每一组输入矢量都能够产生一组对应的期望输出;
若在设置的最大训练次数内,网络未能完成在给定的输入矢量P的作用下,使A=T的目标,则可以通过改用新的初始权值与偏差,并采用更长训练次数进行训练,或分析一下所要解决的的问题是否属于那种由于感知器本身的限制而无法解决的一类,即线性不可分的。
三.求解步骤:
1)对于所要解决的问题,确定输入矢量P,目标矢量T,并由此确定各矢量的维数以及确定网络结构大小的神经元数目:
r,s,q
2)参数初始化,a)赋给权矢量W在(-1,1)的随机非零初始值;
b)给出最大训练循环次数;
3)网络表达式:
根据输入矢量P以及最新权矢量W,计算网络矢量A;
4)检查:
检查输出矢量A与目标矢量T是否相同
5)调整权矢量
四.运行结果
线性可分的程序及产生的图:
程序一:
p=[4-0.50.511.510.522.5-0.3;
1-10.5-1-1.50.521.513];
t=[0111110000];
%在坐标图上绘出样本点
plotpv(p,t);
%建立一个感知器网络
net=newp([-1,1;
-1,1],1);
P=[4-0.50.511.510.522.5-0.3;
T=[0111110000];
%初始化
A=sim(net,P)%训练前的网络输出
net.trainParam.epochs=20;
%定义最大循环次数
net=train(net,P,T);
%训练网络,使输出和期望相同
net.iw{1,1}%输出训练后的网络权值
net.b{1}%输出训练后的网络偏差
A=sim(net,P)%训练后的网络输出
handle=plotpc(net.iw{1},net.b{1});
%利用样本点训练网络并绘出得到的分类线
E=1;
while(sse(E));
[net,Y,E]=adapt(net,p,t);
handle=plotpc(net.iw{1},net.b{1},handle);
end;
%选择10个点来测试网络
testpoints=[4-0.50.511.510.522.5-0.3;
a=sim(net,testpoints);
%在坐标图上绘出网络的分类结果及分类线
figure;
plotpv(testpoints,a);
plotpc(net.iw{1},net.b{1},handle);
运行后的程序:
>
p=[-0.5-0.50.511.510.522.53;
1-10.5-1-1.50.521.510.5];
t=[1111110000];
P=[-0.5-0.50.511.510.522.53;
T=[1111110000];
%训练网络,使输出和期望相同
net.iw{1,1}%输出训练后的网络权值
%选择10个点来测试网络
testpoints=[-0.5-0.50.511.510.522.53;
A=
1111111111
ans=
-0.5000-0.5000
1
1111110000
p=[4-0.50.511.510.522.5-0.3;
%定义最大循环次数
-1.0000-2.5000
4
0111110000
程序二:
%percep3.m
%
P=[-0.500.30-0.300.30.40.30;
00.5-0.51000.3-0.50.21];
T=[0100000110];
V=[-22-22];
net=newp(minmax(P),1,'
hardlim'
'
learnp'
);
%创建一个感知器网络
net.inputweights{1,1}.initFcn='
rands'
;
%赋输入权值的产生函数
net.biases{1}.initFcn='
%赋偏差的产生函数
net=init(net);
%初始化网络
W0=net.iw{1,1}
B0=net.b{1}
A=sim(net,P);
%计算网络输出
net.trainParam.epochs=40;
[nettr]=train(net,P,T);
%训练网络权值
W=net.iw{1,1};
B=net.b{1};
pause%看前面的网络训练结果图形,按任意键继续
plotpv(P,T,V);
holdon
plotpc(W0,B0)%做出分类线的曲线
plotpc(W,B)
holdoff
fprintf('
\nFinalNetworkValues:
\n'
)
W
B
fprintf('
Tainedfor%.0fepochs'
max(tr.epoch));
\nNetworkclassifies:
'
ifall(hardlim(W*P+B)==T)
disp('
Correctly.'
else
Incorrectly.'
end
运行完的程序:
%percep3.m
%赋输入权值的产生函数
%赋偏差的产生函数
%训练网络权值
pause%看前面的网络训练结果图形,按任意键继续
W0=
0.09380.9150
B0=
-0.4430
FinalNetworkValues:
W=
2.6938-1.1850
B=
0.5570
Tainedfor40epochs
Networkclassifies:
Incorrectly.
五:
程序结果分析:
由程序一的运行结果可知,对于给定输入矢量所设计出的单层感知器,只对一部分输出功能是线性可分的。
关于程序二,我们可以发现,随着输入矢量数的增加,线性不可分的功能数急剧增加。
因此,给定一个输入或输出矢量对时,首先必须判别该功能是否是线性可分的。
当输入矢量增多时,更难以确定,一般只有通过用一定的循环次数对网络进行训练而判断它是否能被线性可分。
所以,单层神经元感知器只能用于简单的分类问题。
因此我们应该寻找更好的方法来解决这个问题。
(部分内容摘抄自《MATLAB工具箱的神经网络理论与应用程序源代码丛爽编,国科学技术大学出版社》)