HopField神经网络求解水质问题 实例
Hopfield模型
1982年,J.Hopfield提出了可用作联想存储器的互连网络,这个网络称为Hopfield网络模型,也称Hopfield模型。Hopfield神经网络模型是一种循环神经网络,从输出到输入有反馈连接。Hopfield网络有离散型和连续型两种。
反馈神经网络由于其输出端有反馈到其输入端;所以,Hopfield网络在输入的激励下,会产生不断的状态变化。当有输入之后,可以求取出Hopfield的输出,这个输出反馈到输入从而产生新的输出,这个反馈过程一直进行下去。如果Hopfield网络是一个能收敛的稳定网络,则这个反馈与迭代的计算过程所产生的变化越来越小,一旦到达了稳定平衡状态;那么Hopfield网络就会输出一个稳定的恒值。对于一个Hopfield网络来说,关键是在于确定它在稳定条件下的权系数
应该指出:反馈网络有稳定的,也有不稳定的。对于Hopfield网络来说,还存在如何判别它是稳定网络,亦或是不稳定的问题;而判别依据是什么,也是需要确定的。
离散Hopfield网络
Hopfield最早提出的网络是二值神经网络,神经元的输出只取1和0,所以也称为离散Hopfield神经网络(Discrete Hopfield Neural Network,DHNN)。在DHNN中,所采用的神经元是二值神经元;因此,所输出的离散值1和0分别表示神经元处于**和抑制状态。
1.网络结构
DHNN是一种单层的、其输入/输出为二值的反馈网络。假设一个由三个神经元组成的离散Hopfield神经网络,其结构如下:
上图中,第0层仅仅是作为网络的输入,它不是实际神经元,所以无计算功能;第一层是神经元,故而执行对输入信息和权系数乘积求累加和,并经非线性函数f处理之后产生输出信息。f是一个简单的阈值函数,如果神经元的输出信息大于阈值θ,那么,神经元的输出取值为1,;小于阈值θ,则神经元的输出取值为0。
对于二值神经元它的计算公式:
上式中,xj是外部输入。
并且有:
一个DHNN的网络状态是输出神经元信息的集合。对于一个输出层是n个神经元的网络,其t时刻的状态为一个n维向量:
因为yi(t)(i=1,2,···,n)可以取值为1或0,故n维向量Y(t)有2^n种状态,即网络有2^n种状态。
对于有三个神经元的DHNN,它的输出层就是三位二进制数;每一个三位二进制数就是一种网络状态,共有2^3=8个网络状态,这些网络状态如图所示:
在上图中,立方体的每一个顶点表示一种网络状态。同理,对于n个神经元的输出层,有2^n中网络状态,也和一个n维超立方体的顶角相对应。
如果Hopfield网络是一个稳定网络,如在网络的输入端加入一个输入向量,则网络的状态会产生变化,即从超立方体的一个顶角转向另一个顶角,并且最终稳定于一个特定的顶角。
对于一个n个神经元组成的DHNN,有n*n权系数**矩阵**W:
同时,有n维阈值向量θ:
2.稳定性
对于一个反馈网络来说稳定性是一个重大的性能指标。
假设一个DHNN,其状态为Y(t):
如果对于任何Δt>0,当神经网络从t=0开始,有初始状态Y(0)。经过有限时刻t,有:
Y(t+Δt)=Y(t)
则认为网络是稳定的。
Hopfield网络稳定的充分条件:如果Hopfield网络的权系数矩阵W是一个对称矩阵,并且对角线元素为0,则这个网络是稳定的。即在权系数矩阵W中,如果:
则Hopfield网络是稳定的。
Hopfield模型的联想记忆过程
hopfield的运行过程分为记忆过程与联想过程。
1.记忆过程
先设定网络参数,并按下式计算加权值矩阵。
2.联想过程
1)设定网络参数
2)读入加权值矩阵W
3)从测试范例输入初始状态向量
4)计算新的状态向量X
水质评价的Hopfield模型
联想过程
有五个稳定点,每个稳定点用5*8的矩阵表示。
private int[][] input = {
{1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1},
{1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1},
{1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1},
{1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
根据设定的网络参数调计算加权矩阵
int[][] weights = new int[40][40];
public void weightAdjust(){
for(int i=0;i<40;++i){
for(int j=0;j<40;++j){
if(i==j){
weights[i][j]=0;
}else{
int tempResult=0;
for(int k=0;k<5;++k){
tempResult+=input[k][i]*input[k][j];
}
weights[i][j]=tempResult;
}
}
}
记忆过程
输入欲识别模式
int[] arr1 = new int[]{1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1};
ArrayList al1 = new ArrayList();
al1.addAll(Arrays.asList(arr1));
testInput.add(al1);
int[] arr2 = new int[]{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
ArrayList al2 = new ArrayList();
al2.addAll(Arrays.asList(arr2));
testInput.add(al2);
int[] arr3 = new int[]{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
ArrayList al3 = new ArrayList();
al3.addAll(Arrays.asList(arr3));
testInput.add(al3);
int[] arr4 = new int[]{1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1};
ArrayList al4 = new ArrayList();
al4.addAll(Arrays.asList(arr4));
testInput.add(al4);
迭代收敛
随机地更新某一神经元的状态。
使用串行的工作方式运行Hopfield网络。
运行步骤为:1.从网络中随机选取一个神经元,如果已经计算了它在t+1时刻的输出则重新寻找别的神经元,求出它的输入和输出。
2.判断是否将所有神经元的t+1时刻的输出都计算了出来,比较每一个神经元的V(t)和V(t+1)是否相等。如果都相等则表示网络已经稳定(本实验并没有采用能量函数判断网络是否达到稳定,不确定这样做是否合理,如果有错误请指正)。不稳定则回到上一步继续迭代。
3.网络如果稳定,则输出当前网络状态,即为水质结果。
实验结果
上一篇: 神经网络设计过程