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

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

      
  • 计算来自其他神经元的带权重的输入之和:对神经元1的输入和
  •    = w12*神经元2的输出+ w13*神经元3的输出+     … + w1n*神经元n的输出
       =∑w1ixi, i=2…n;wij--神经元 j 与神经元 i的连接权重;xi—-神经元 i 的输出
       
  • 输入之和通过非线性函数f(.)变成输出该非线性函数的存在,是神经网络能力的源泉f(.)大多具有饱和特性,即函数的值限制在某范围内
  •   

    hopfield网络运行规则
   

        
  1. 从网中随机选取一个神经元i
  2.     
  3. 求所选中的神经元i的所有输入加权和: Hi = ∑jwijxj-θi ,j=1…n, j≠i
  4.     
  5. 计算i 的第 t+1 时刻的输出值:
  6. IF   Hi(t)≥0, xi(t+1)= 1
           Hi(t)<0,  xi(t+1)= -1
        
  7. i以外,所有神经元输出保持不变:
  8. xj(t+1)=  xj(t),j=1,2,…n,j≠i
        
  9. 返回到第1)步,直到进入稳定状态
  10.    

   反馈网络的一个重要特点是具有稳定状态:
无论再怎么更新下去,网络各神经元的输出状态不再改变,就是稳定状态:
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网络运行规则中,神经元最终会到达一个稳定状态,能量持续减弱,最终到达一个极值。

你可能感兴趣的:(编程,算法,F#,J#)