sponsored links

神经网络模型与hopfield网运行规则

最近开了软计算的课,课程本身要求将涉及算法编程实现,就将本课程内容在这里做一个记录。
   神经元的模型

  • 计算来自其他神经元的带权重的输入之和:对神经元1的输入和
  • = w12*神经元2的输出+ w13*神经元3的输出+     … + w1n*神经元n的输出
       =∑w1ixi, i=2…n;wij--神经元 j 与神经元 i的连接权重;xi—-神经元 i 的输出

  • 输入之和通过非线性函数f(.)变成输出该非线性函数的存在,是神经网络能力的源泉f(.)大多具有饱和特性,即函数的值限制在某范围内

hopfield网络运行规则

  1. 从网中随机选取一个神经元i
  2. 求所选中的神经元i的所有输入加权和: Hi = ∑jwijxj-θi ,j=1…n, j≠i
  3. 计算i 的第 t+1 时刻的输出值:
  4. IF   Hi(t)≥0, xi(t+1)= 1
           Hi(t)<0,  xi(t+1)= -1

  5. i以外,所有神经元输出保持不变:
  6. xj(t+1)=  xj(t),j=1,2,…n,j≠i

  7. 返回到第1)步,直到进入稳定状态

反馈网络的一个重要特点是具有稳定状态:
无论再怎么更新下去,网络各神经元的输出状态不再改变,就是稳定状态:
xi (t+1) = xi (t) = Sgn ( Hi), i=1…n
   Hopfield网络能量函数
   能量=系数*某物理量*某物理量,E =  - 0.5∑i∑jwijxixj + ∑iθixi
  将上述规则用代码实现如下


public class HopfieldRule {

    static int [] initCellValue ={1,1,-1,-1,-1};
    int [] initObjectValue ={10,-2,3,1,5};
    int [] inputValue=new int [5];
    int cellNumber = 5;
    int [][] a=new int [cellNumber][cellNumber];
    static int runTimes=40;
    static int[] energy;
    //t [] energy = new int [cellNumber];
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HopfieldRule hopfield=new HopfieldRule();
        hopfield.init();
        System.out.print("初始状态下,输出值为");
        for(int i : initCellValue){
            System.out.print(i+"  ");
        }
        System.out.println();
        for(int i=0;i<runTimes;i++){
            hopfield.CalculateOutput();
            hopfield.CalculateEnergy(i);
            System.out.print("第"+(i+1)+"次迭代后,输出值为");
            for(int j : initCellValue){
                System.out.print(j+"  ");
            }
            System.out.print("能量值为"+energy[i]);
            System.out.println();
        }
    }

    public void init(){
        for(int i=0;i<a.length;i++)
            for(int j=0;j<=i;j++){
                if(j==i)
                    a[i][j]=0;
                else
                    a[i][j]=a[j][i]=(int) (Math.random()*10);
            }
    }

    public void CalculateOutput(){
        int start=(int) (Math.random()*5);
        for(int i=0;i<a.length;i++){
            inputValue[start] +=a[start][i]*initCellValue[i];
        }
        inputValue[start] -=initObjectValue[start];
        if(inputValue[start]>=0){
            initCellValue[start]=1;
        }else{
            initCellValue[start]=-1;
        }

    }

    public void CalculateEnergy(int i){
        energy=new int [runTimes];
        int q = 0,w=0;
        for(int m=0;m<a.length;m++)
            for(int n=0;n<a.length;n++){
                q+=-0.5*a[m][n]*initCellValue[m]*initCellValue[n];
            }
        for(int m=0;m<a.length;m++){
            w+=initCellValue[m]*initObjectValue[m];
        }
        energy[i]=q+w;
    }

}

运行结果如下
初始状态下,输出值为1  1  -1  -1  -1 
第1次迭代后,输出值为1  -1  -1  -1  -1  能量值为1
第2次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第3次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第4次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第5次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第6次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第7次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第8次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第9次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第10次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第11次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第12次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第13次迭代后,输出值为1  -1  -1  1  -1  能量值为-1
第14次迭代后,输出值为-1  -1  -1  1  -1  能量值为-33
第15次迭代后,输出值为-1  -1  -1  1  -1  能量值为-33
第16次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第17次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第18次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第19次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第20次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第21次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第22次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第23次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第24次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第25次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第26次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第27次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第28次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第29次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第30次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第31次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第32次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第33次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第34次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第35次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第36次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第37次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第38次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第39次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
第40次迭代后,输出值为-1  -1  -1  -1  -1  能量值为-63
    可以看出,hopfield网络运行规则中,神经元最终会到达一个稳定状态,能量持续减弱,最终到达一个极值。