您的位置:首页 > 理论基础 > 计算机网络

机器学习(周志华) 参考答案 第五章 神经网络 5.5

2016-08-03 19:06 429 查看

机器学习(周志华) 参考答案 第五章 神经网络 5.5

机器学习(周志华西瓜书) 参考答案 总目录

http://blog.csdn.net/icefire_tyh/article/details/52064910

机器学习(周志华) 参考答案 第五章 神经网络

http://blog.csdn.net/icefire_tyh/article/details/52106899

BP网络算是这章最重要的算法了,它提供了一种基于导数的训练大部分神经网络的思路


5.试编程实现标准BP算法与累积BP算法,在西瓜数据集3.0上分别用这两个算法训练一个单隐层网络,并进行比较。

假设一个单隐层BP网络中

d个输入节点

隐层有q个神经元

输出层l个神经元

BP算法要训练的参数有

输入层与隐层全连接的权值vij d*q个

隐层神经元阀值 θi q个

隐层与输出层全连接的权值wij q*l个

输出层神经元阀值 γi l个

BP算法每次迭代依次计算每一个样本,最小化该样本输出值与真实值的差距,然后将修改过参数传给下一个样本,直到达到收敛条件。这样做参数更新频繁,也可能出现参数更改相互抵销的情况,于是便有了ABP。

ABP算法每次迭代会先算出所有样本的输出,然后最小化整个样本输出与真实值的最小平方和,修改参数后进行下一次迭代。ABP参数更新次数比BP算法少的多,但是当累计误差降到一定程度时,进一步下降会非常缓慢。

迭代终止条件:这里设置的终止条件是相邻一百次迭代的累计误差的差值不超过0.001。

BP算法结果:

在西瓜数据集3上迭代1596次迭代,使得累计误差达到0.0013,此时对比表为

输出值真实值
0.0005742390
0.0031288930
0.0018804750
0.0167254070
0.0190838110
0.9931340771
0.9936627991
0.9779694581
0.9907245071
0.9870874671
0.0051250690
0.0085426220
0.0237220060
0.990069931
0.996899231
0.9895696811
0.9865902431
下面是BP代码

clear

x = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'A1:Q8');
y = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'A9:Q9');
x=x';
y=y';
%将y设为0,1两类
y=y-1;
%获取输入参数的样本数与参数数
[m,n]=size(x);

t=1;    %输出层神经元

v=rand(n,n+1);  %输入层与隐层的权值
w=rand(n+1,t);  %隐层与输出层的权值
thy=rand(n+1);  %隐层阀值
thj=rand(t);    %输出层阀值
ty=zeros(m,t);  %输出层输出
b=zeros(n+1);   %隐层输出
gj=zeros(t);    %累计误差对w,thj求导的参数
eh=zeros(n+1);  %累计误差对v,thy求导的参数
xk=1;           %学习率

kn=0;           %迭代次数
sn=0;           %同样的累计误差值累积次数
old_ey=0;       %前一次迭代的累计误差
while(1)
kn=kn+1;
ey=0;       %当前迭代的累计误差
for i=1:m
%计算隐层输出
for j=1:n+1
ca=0;
for k=1:n
ca=ca+v(k,j)*x(i,k);
end
b(j)=1/(1+exp(-ca+thy(j)));
end
%计算输出层输出
for j=1:t
cb=0;
for k=1:n+1
cb=cb+w(k,j)*b(k);
end
ty(i,j)=1/(1+exp(-cb+thj(j)));
end
%计算当前迭代累计误差
for j=1:t
ey=ey+((y(i)-ty(i,j))^2)/2;
end
%计算w,thj导数参数
for j=1:t
gj(j)=ty(i,j)*(1-ty(i,j))*(y(i)-ty(i,j));
end
%计算v,thy导数参数
for j=1:n+1
teh=0;
for k=1:t
teh=teh+w(j,k)*gj(k);
end
eh(j)=teh*b(j)*(1-b(j));
end
%更新v,thy
for j=1:n+1
thy(j)=thy(j)+(-xk)*eh(j);
for k=1:n
v(k,j)=v(k,j)+k*eh(j)*x(i,k);
end
end
%更新thj,w
for j=1:t
thj(j)=thj(j)+(-xk)*gj(j);
for k=1:n+1
w(k,j)=w(k,j)+xk*gj(j)*b(k);
end
end
end
%迭代终止判断
if(abs(old_ey-ey)<0.0001)
sn=sn+1;
if(sn==100)
break;
end
else
old_ey=ey;
sn=0;
end

end


ABP:与BP算法最大的不同是参数在计算完全部样本才更改,由于ABP后期下降很慢,所以ABP的终止条件是50次相同的累计误差。

经过1660次迭代,累计误差达到0.0015。

输出值真实值
0.003375345237624590
0.001978858664714790
0.003797114630163950
0.02056968005672970
0.02082291739102280
0.9949650855125521
0.9895071026410391
0.9661007394594331
0.9931375486300171
0.9935687206872351
0.008208314995813660
0.01061590518158790
0.01996537507741570
0.9957193001475381
0.9933198302826171
0.9922532463223611
0.9868231434096781
下面是ABP代码

clear
x = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'A1:Q8');
y = xlsread('C:\Users\icefire\Desktop\ml\西瓜3.xlsx', 'sheet1', 'A9:Q9');
x=x';
y=y';
y=y-1;
[m,n]=size(x);
t=1;    %输出层神经元

v=rand(n,n+1);  %输入层与隐层的权值
w=rand(n+1,t);  %隐层与输出层的权值
thy=rand(n+1);  %隐层阀值
thj=rand(t);    %输出层阀值
ty=zeros(m,t);  %输出层输出
b=zeros(n+1);   %隐层输出
gj=zeros(t);    %累计误差对w,thj求导的参数
eh=zeros(n+1);  %累计误差对v,thy求导的参数
tk=1;           %学习率

kn=0;           %迭代次数
sn=0;           %同样的累计误差值累积次数
old_ey=0;       %前一次迭代的累计误差
while(1)
kn=kn+1;
ey=0;%当前迭代的累计误差
%计算全部样本输出层输出
for i=1:m
%计算隐层输出
for j=1:n+1
ca=0;
for k=1:n
ca=ca+v(k,j)*x(i,k);
end
b(i,j)=1/(1+exp(-ca+thy(j)));
end
%计算输出层输出
for j=1:t
cb=0;
for k=1:n+1
cb=cb+w(k,j)*b(i,k);
end
ty(i,j)=1/(1+exp(-cb+thj(j)));
end
end
%用来存累计误差对四个变量的下降方向
tv=zeros(n,n+1);
tw=zeros(n+1,t);
tthy=zeros(n+1);
tthj=zeros(t);
%计算累计误差
for i=1:m
for j=1:t
ey=ey+((y(i)-ty(i,j))^2)/2;
end
%计算w,thj导数参数
for j=1:t
gj(j)=ty(i,j)*(1-ty(i,j))*(y(i)-ty(i,j));
end
%计算v,thy导数参数
for j=1:n+1
teh=0;
for k=1:t
teh=teh+w(j,k)*gj(k);
end
eh(j)=teh*b(i,j)*(1-b(i,j));
end

%计算w,thj导数
for j=1:n+1
tthy(j)=tthy(j)+(-1)*eh(j);
for k=1:n
tv(k,j)=tv(k,j)+k*eh(j)*x(i,k);
end
end
%计算v,thy导数
for j=1:t
tthj(j)=tthj(j)+(-1)*gj(j);
for k=1:n+1
tw(k,j)=tw(k,j)+gj(j)*b(i,k);
end
end
end
%更新参数
v=v+tk*tv;
w=w+tk*tw;
thy=thy+tk*tthy;
tthj=thj+tk*tthj;
%迭代终止条件
if(abs(old_ey-ey)<0.0001)
sn=sn+1;
if(sn==50)
break;
end
else
old_ey=ey;
sn=0;
end

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习