欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HopField神经网络求解水质问题 实例

程序员文章站 2022-04-05 08:53:42
...

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神经网络,其结构如下:

HopField神经网络求解水质问题 实例

上图中,第0层仅仅是作为网络的输入,它不是实际神经元,所以无计算功能;第一层是神经元,故而执行对输入信息和权系数乘积求累加和,并经非线性函数f处理之后产生输出信息。f是一个简单的阈值函数,如果神经元的输出信息大于阈值θ,那么,神经元的输出取值为1,;小于阈值θ,则神经元的输出取值为0。
对于二值神经元它的计算公式: HopField神经网络求解水质问题 实例

上式中,xj是外部输入。
并且有:

HopField神经网络求解水质问题 实例

一个DHNN的网络状态是输出神经元信息的集合。对于一个输出层是n个神经元的网络,其t时刻的状态为一个n维向量:
HopField神经网络求解水质问题 实例

因为yi(t)(i=1,2,···,n)可以取值为1或0,故n维向量Y(t)有2^n种状态,即网络有2^n种状态。
对于有三个神经元的DHNN,它的输出层就是三位二进制数;每一个三位二进制数就是一种网络状态,共有2^3=8个网络状态,这些网络状态如图所示:
HopField神经网络求解水质问题 实例

在上图中,立方体的每一个顶点表示一种网络状态。同理,对于n个神经元的输出层,有2^n中网络状态,也和一个n维超立方体的顶角相对应。

如果Hopfield网络是一个稳定网络,如在网络的输入端加入一个输入向量,则网络的状态会产生变化,即从超立方体的一个顶角转向另一个顶角,并且最终稳定于一个特定的顶角。
对于一个n个神经元组成的DHNN,有n*n权系数**矩阵**W:
HopField神经网络求解水质问题 实例

同时,有n维阈值向量θ:HopField神经网络求解水质问题 实例

HopField神经网络求解水质问题 实例

2.稳定性

对于一个反馈网络来说稳定性是一个重大的性能指标。
假设一个DHNN,其状态为Y(t): HopField神经网络求解水质问题 实例

如果对于任何Δt>0,当神经网络从t=0开始,有初始状态Y(0)。经过有限时刻t,有:
Y(t+Δt)=Y(t)
则认为网络是稳定的。
Hopfield网络稳定的充分条件:如果Hopfield网络的权系数矩阵W是一个对称矩阵,并且对角线元素为0,则这个网络是稳定的。即在权系数矩阵W中,如果:
HopField神经网络求解水质问题 实例
则Hopfield网络是稳定的。

Hopfield模型的联想记忆过程

hopfield的运行过程分为记忆过程与联想过程。
1.记忆过程
先设定网络参数,并按下式计算加权值矩阵。
HopField神经网络求解水质问题 实例

2.联想过程
1)设定网络参数
2)读入加权值矩阵W
3)从测试范例输入初始状态向量
4)计算新的状态向量X

水质评价的Hopfield模型

联想过程

HopField神经网络求解水质问题 实例

有五个稳定点,每个稳定点用5*8的矩阵表示。
HopField神经网络求解水质问题 实例

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}
        }; 

根据设定的网络参数调计算加权矩阵
HopField神经网络求解水质问题 实例

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;
                }
            }
        }

记忆过程

输入欲识别模式
HopField神经网络求解水质问题 实例

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时刻的输出则重新寻找别的神经元,求出它的输入和输出。
HopField神经网络求解水质问题 实例

HopField神经网络求解水质问题 实例

2.判断是否将所有神经元的t+1时刻的输出都计算了出来,比较每一个神经元的V(t)和V(t+1)是否相等。如果都相等则表示网络已经稳定(本实验并没有采用能量函数判断网络是否达到稳定,不确定这样做是否合理,如果有错误请指正)。不稳定则回到上一步继续迭代。

3.网络如果稳定,则输出当前网络状态,即为水质结果。

实验结果

HopField神经网络求解水质问题 实例