BP网络下的梯度下降算法的matlab代码

function ww = gradient_descent(training_example,eta)
[m,n] = size(training_example); %m--行,n--列
num_x = n-1; %输入量个数 ,最后一项是目标值,所以少一个
for i=1:num_x   %初始化权值矩阵在(-1,1),这个相对较好
    w(i) = 2*(rand()-0.5);
end
fault = 1;  
while(fault>1e-5)  %给定的判断条件
      fault = 0;
      delta_w(1:num_x) = 0;  %初始化误差值
     %----------------对于每一行数据----------------------------
      for i=1:m
          xx = training_example(i,1:num_x)';  %第i行的所有x值
          output(i) = w*xx;    %计算输出值
          if output(i)>0      %如果输出大于0,让它等于1,这样误差为0,
              output(i)=1;
          else output(i)=0;   
          end
          t = training_example(i,n);  %第i行的目标值
          for j=1:num_x
              delta_w(j) = delta_w(j) + eta*(t-output(i))*training_example(i,j); %产生误差项
          end
      end
      %---------------更新权值矩阵---------------------------
      for j=1:num_x
          w(j) = w(j) + delta_w(j);
      end
      %----------------根据新的权值矩阵计算一下目标函数的现在的输出out--------------------------
      for i=1:m
          out(i) = w*training_example(i,1:num_x)';
          if out(i)>0 out(i)=1;
          else out(i)=0;
          end
      end
      %-------------------判断条件:所有的out值与所给的t一样------------------------------------
      %------------------方法比较笨,就是一个一个比较,肯定有更好的结束条件,还没想好-------------
      if ((out(1)==1)&&(out(2)==1)&&(out(3)==1)&&(out(4)==1)&&(out(5)==0)&&(out(6)==0)&&(out(7)==0)&&(out(8)==0))
          fault=0;   %条件符合了,结束
      else fault=1;  %没符合,继续运行
      end
end

ww = w;    %最后返回所得的权值矩阵

其中第一个输入:training_example为样本数据,及所属类别,eta步长,一般很小:0.1

窗口输入:

s=[-3,-5,1;1,0,1;2,1.5,1;-1,-1.5,1;0,2,0;1.5,2,0;-1,0,0;-2,-1.5,0];

w = gradient_descent(s,0.1);plot(s(1:4,1),s(1:4,2),'*',s(5:8,1),s(5:8,2),'+');

 hold on;k=[-5:0.1:5];

p = -w(1)/w(2)*k;

plot(k,p);

BP网络下的梯度下降算法的matlab代码_第1张图片BP网络下的梯度下降算法的matlab代码_第2张图片



你可能感兴趣的:(BP网络下的梯度下降算法的matlab代码)