最近开了软计算的课,课程本身要求将涉及算法编程实现,就将本课程内容在这里做一个记录。
神经元的模型
- 计算来自其他神经元的带权重的输入之和:对神经元1的输入和
= w12*神经元2的输出+ w13*神经元3的输出+ … + w1n*神经元n的输出
=∑w1ixi, i=2…n;wij--神经元 j 与神经元 i的连接权重;xi—-神经元 i 的输出
- 输入之和通过非线性函数f(.)变成输出该非线性函数的存在,是神经网络能力的源泉f(.)大多具有饱和特性,即函数的值限制在某范围内
hopfield网络运行规则
- 从网中随机选取一个神经元i
- 求所选中的神经元i的所有输入加权和: Hi = ∑jwijxj-θi ,j=1…n, j≠i
- 计算i 的第 t+1 时刻的输出值:
IF Hi(t)≥0, xi(t+1)= 1
Hi(t)<0, xi(t+1)= -1
- i以外,所有神经元输出保持不变:
xj(t+1)= xj(t),j=1,2,…n,j≠i
- 返回到第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网络运行规则中,神经元最终会到达一个稳定状态,能量持续减弱,最终到达一个极值。