• 神经网络感知器matlab实现


    1.基本原理

          神经网络里最简单的模型,就是感知器。感知器可以实现N维空间的线性划分。如二维空间,下图就是用一条直线将(0 0)分为一类,其余四点为一类。实现了与门。

    image

          如果要将以上四点划分为(0 1)(1 0)为一类,(1 1)(0 0)为一类,显然是无法用直线将其分开。如果是三维空间,就是平面划分。如果N维,即超平面。

          下图为一个神经元模型,输入为pX1的向量,输出为a。感知器工作时,首要要学习,也就是对w和b进行调整。首先要有n个P向量,和一个你期望的该p向量得到的t值。w和b是不为0的随机值,训练的目的就是调整w和b的值,使e=t-a的值不断接近0。当所有样本输出的值都等于t时,学习结束。

    image

    image

         这是,给定相关值,你就可以得到你期望的结果。其中wp+b累加输出的值n,要经过一个函数,这个函数根据需要选取,并不一定要取阶跃函数。

         下图可以看出在二维空间了w和b分别是如何影响划分的直线的。

    image

    2.单层感知器

           以下图为感知器基本模型,摘自matlab的帮助文档。

    image

    上图有以下几个要点:

    2.1 R为输入个数,S为单层神经元的个数。感知器里可以有s个神经元,但神经元之间无信息传递,之间互不影响。

    2.2 输出是sX1的a向量,实现了对RX1的p向量的s次在R维空间的线性二划分。

    综合以上分析,可以看出神经网络设计的重点:

    2.1 如何将神经元相互联系起来,即网络的设计;

    2.2 选择什么样的方法调整每个神经元的w和b值,该算法必须收敛,即在有限步骤内,让误差e趋近0;

    2.3 每个神经元选择什么样的函数得到a输出;

    3. 算法实现(matlab)

    其中P为RXN输入矩阵,T为SXN的目标矩阵;

    R为输入个数,N为训练的样本数;

    S为神经元个数;

    repeat为最大迭代次数;W b e为经过训练得到的W b e;如果线性可分的话,并在repeat步类收敛,e就是0。

       1:  function [W b e] = perceptron(P, T, repeat)
       2:  switch nargin
       3:      case 0
       4:      case 1
       5:          error('Must enter P and T');
       6:      case 2    
       7:          repeat = 10000;
       8:  end
       9:  [r n]=size(P);
      10:  s =size(T,1);
      11:  W=ones(s,r);
      12:  b=ones(s,1);
      13:  e=ones(s,n);
      14:  for i=1:repeat
      15:      index=mod(i,n); 
      16:      if(index == 0)
      17:          index = 4;
      18:      end
      19:      p=P(:,index);
      20:      t=T(:,index);
      21:      a= W*p + b;
      22:      for j=1:s
      23:          if a(j) >= 0
      24:              a(j) = 1;
      25:          else
      26:              a(j) = 0;
      27:          end
      28:      end
      29:      %e:s by n
      30:      e(:,index)=(t-a)*0.5;
      31:      W=W+e(:,index)*p';
      32:      b=b+e(:,index);
      33:      if(e == 0)
      34:          break;
      35:      end
      36:  end
      37:  end
     
         这里需要说明一下w和b是如何调整的,即31行。新的权重值为旧的加上误差值乘以输入,思想很简单。即用误差调整w和b,显然误差为0,就无调整。不为0,就朝着使误差减小的方向调整,即负反馈的思想。乘以输入,是对调整的修正,使调整更加迅速。可以设想,如果一个输入非常小,一个非常大,那输入小的增量也要小,大的增量也要大。如果都大,那就容易产生震荡。如果小,收敛就很慢,需要学习的时间就会变得很长。
     
     
  • 相关阅读:
    怎么加载用户自定义控件
    一个C#委托的示例
    signed add
    避免QuartusII中将没有进行定义的信号自动生成wrie类型
    serial_to_parallel
    用modelsim仿真——对文件的操作
    base of logic
    blocking PK nonblocking
    parallel to serial
    使用signalTapII看综合掉的wrie和register的值
  • 原文地址:https://www.cnblogs.com/gghost/p/2986087.html
Copyright © 2020-2023  润新知