BP算法与累积BP算法

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

BP算法matlab实现

clear

x = xlsread('watermelon3.0.xlsx', 'Sheet1', 'A1:Q8');
y = xlsread('watermelon3.0.xlsx', 'Sheet1', 'A9:Q9');
x=x';
y=y';
%将y设为0,1两类
y=y-1;
%获取输入参数的样本数与参数数
[m,n]=size(x);

t=1;    %输出层神经元
rand('seed',0);
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;       %前一次迭代的累计误差

EY_BP = zeros(2175); #随机种子为0的时候,BP算法迭代2175次终止
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
   EY_BP(kn) = ey;
    %迭代终止判断
   if(abs(old_ey-ey)<0.0001)
       sn=sn+1;
       if(sn==100)
           break;
       end
   else
       old_ey=ey;
       sn=0;
   end
end
save('EY_BP.mat','EY_BP')   

ABP算法matlab实现

clear
x = xlsread('watermelon3.0.xlsx', 'Sheet1', 'A1:Q8');
y = xlsread('watermelon3.0.xlsx', 'Sheet1', 'A9:Q9');
x=x';
y=y';
y=y-1;
[m,n]=size(x);
t=1;    %输出层神经元

rand('seed',0);
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;       %前一次迭代的累计误差

EY_ABP = zeros(1305); %在随机种子为0的情况下,ABP达到终止条件,迭代了1305次
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;
    %迭代终止条件
   EY_ABP(kn) = ey;
   if(abs(old_ey-ey)<0.0001)
       sn=sn+1;
       if(sn==50)
           break;
       end
   else
       old_ey=ey;
       sn=0;
   end
end
save('EY_ABP.mat','EY_ABP');

在这里插入图片描述西瓜书:一般来说,标准BP算法每次更新只针对单个样本,参数更新地非常频繁,而且对不同地样例进行更新的效果可能出现抵消的现象,因此,达到同样的累积误差极小值点,标准BP算法往往需要更多的迭代次数。累积BP算法直接对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新,其参数的更新频率低很多,在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时候,标准BP往往会获得较好的解,尤其在训练集D非常大的时候更加明显。

标准BP算法与累积BP算法之间的区别,类似于随机梯度下降(SGD)与标准梯度下降之间的区别。

相关python实现可参考:

https://blog.csdn.net/qdbszsj/article/details/79110888

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作业一(Matlab) 假设x=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),y=( 2.94, 4.53, 5.96, 7.88, 9.02, 10.94, 12.14, 13.96, 14.74, 16.68, 17.79, 19.67, 21.20, 22.07, 23.75, 25.22, 27.17, 28.84, 29.84, 31.78).请写出拟合的直线方程,并画图(包括原数据点及拟合的直线),请打印出来。 请使用线性回归模型来拟合bodyfat数据。数据集介绍可阅读:https://www.mathworks.com/help/nnet/examples/body-fat-estimation.html 在matlab中,在命令行中输入[X,Y] = bodyfat_dataset; 即可获得一个拥有13个属性,252个样本的数据集。使用前200个样本来获得模型,并写出你所获得的模型。使用后52个样本做测试,汇报你所获得的泛化误差。 编程实现对数回归,并给出教材89页上的西瓜数据集3.0上的结果。要求采用4折交叉验证法来评估结果。因为此处一共17个样本,你可以去掉最后一个样本,也可以用所有数据,然后测试用5个样本。在汇报结果时,请说明你的选择。请在二维图上画出你的结果(用两种不同颜色或者形状来标注类别),同时打印出完整的代码。 作业二 采用信息增益准则,基于表4.2中编号为1、2、3、6、7、9、10、14、15、16、17的11个样本的色泽、根蒂、敲声、文理属性构建决策树。(本次作业可以用笔算,鼓励编程实现,但都需要列出主要步骤,其中log2(3)=1.585,log2(5)=2.322,log2(6)=2.585,log2(7)=2.807,log2(9)=3.17,log2(10)=3.322,log2(11)=3.459) 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对上题的训练数据采用预剪枝策略构建决策树,并汇报验证集精度。 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对题1所构建的决策树进行后剪枝,并汇报验证集精度。 作业三(Matlab) 试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证集计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ,在西瓜数据集3.0a上分别用线性核训练一个SVM。用正类1-6和负类9-14作为训练集,其余作为测试集。C取不同的值,其它参数设为默认值。作出测试正确率随C取值变化的图,C=[1 100 10000 10^6 10^8]。 换成高斯核(宽度设为1),重复上题的步骤。 作业五 以西瓜数据集2.0(见教材76页表4.1)中样本1--16为训练集训练一个朴素贝叶斯分类器,对测试样本17进行分类。请写出详细的计算过程。 假设x_k是一个班上学生的分数,对应的分数及其分布是 x_1=30, P1=0.5,一共有14个学生; x_2=18, P2=mu,有6个学生; x_3=20, P3=2mu,有9个学生; x_4=23, P4=0.5-3mu,有10个学生; 通过最大对数似然法求出mu的值。 作业六(Python) 1 使用PCA对Yale人脸数据集进行降维,并分别观察前20、前100个特征向量所对应的图像。请随机选取3张照片来对比效果。数据集http://vision.ucsd.edu/content/yale-face-database
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猴猴猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值