依据反向传播原理实现BP算法(MATLAB)

根据反向传播(BP)原理,不调用MATLAB提供的函数,简单实现BP算法。
反向传播(BP)网络是采用误差反向后传学习算法训练的前馈网络。其实现步骤为:
(1) 前向:求出所有神经元的输出

2)计算实际输出和期望输出之间的均方误差


(3)反向:对每个结点,求出误差对权值的偏导数(梯度)


(4)利用迭代公式更新网络权值


(5)判断是否继续迭代还是结束


实例为一个含有两层隐含层的四层网络结构,网络模型如图所示:


分别修改初值和步长,误差下降曲线如图所示:


代码如下:

for i=1:length(y1)  
       s1(i)=1/(1+exp(-y1(i)));%对输出进行尺度调整至(01)范围  
       s2(i)=1/(1+exp(-y2(i)));  
end  
data = [x1;x2;x3;s1;s2];
eta=1;
[m,n] = size(data); %m--行,n--列  
%初始化权值矩阵-0.5~0.5之间  
w =1.5*ones(2,3);      
v =1.59*ones(3,2);  
u =1.5*ones(2,3);  
%{
w = rand(2,3) - 0.5;      
v = rand(3,2) - 0.5;  
u = rand(2,3) - 0.5;  
%}
%------------------------  
for num = 1:n  %对每组输入量与输出量  
%%----------------------------------------  
        one_sample = data(:,num); %取一组  
        x = one_sample(1:3);        %提取其中的输入  
        y = one_sample(4:5);        %提取其中的输出  
        net2 = w * x;               %第一层求和值  
        for i=1:2  
             hidden1(i)=1/(1+exp(-net2(i)));%进行sigmoid处理输出  
        end  
        net3 = v * hidden1';      %第二层求和值   
        for i=1:3  
             hidden2(i)=1/(1+exp(-net3(i)));%进行sigmoid处理输出  
        end  
        net4 = u * hidden2';      %第三层求和值  
        for i=1:2  
            o(i)=1/(1+exp(-net4(i)));%sigmoid处理输出,最终的输出值o  
        end  
%%-------------反向传播算法,计算各层delta值(误差E对各层权值的导数)-----------------  
       %最后一层delta值  
        for i = 1:2  
             delta3(i) = (y(i)-o(i))*o(i)*(1-o(i)); %计算公式  
        end  
       %-----第二个隐含层---  
        for j = 1:3      %计算公式,与其后一层的delta值相关  
             delta2(j) = hidden2(j)*(1-hidden2(j))*delta3*u(:,j);  
        end  
       %-----第一个隐含层---  
        for k = 1:2      %计算公式,与其后一层的delta值相关  
             delta1(k) = hidden1(k)*(1-hidden1(k))*delta2*v(:,k);  
        end  
%---------------------------------------------------------  
%--------各层delta计算完后开始更新权值---------------------  
%---更新u权值-----  
        for i = 1:2   
               for j = 1:3      %计算公式  w = w + eta*delta*x  
                     u(i,j) = u(i,j) + eta*delta3(i)*hidden2(j);  
               end  
        end  
%---更新v权值-----  
        for i = 1:3  
                for j = 1:2  
                     v(i,j) = v(i,j) + eta*delta2(i)*hidden1(j);  
                end  
        end  
%---更新w权值-----  
        for i = 1:2  
                for j = 1:3  
                     w(i,j) = w(i,j) + eta*delta1(i)*x(j);  
                end  
        end  
%---------------------------------------------------------  
%--------------记录一下这个过程后的误差值  
            e=o'-y;%计算误差向量  (计算输出-目标输出)  
            sigma(num)=e'*e;%计算误差平方和  
end  
%%-------------------------------------------------------  
plot(sigma);  
  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值