Hopfield神经网络无法识别

use*_*946 8 java artificial-intelligence neural-network

我正在尝试用Java编写Hopfield神经网络类,但网络不想识别模式.我无法理解错误在哪里.网络用互连矩阵w [n] [n]表示.当用一些标准模式教授网络时,我用以下方法改变互连矩阵:

private void teaching(int[] pattern){ //teaching
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++){
            if(i==j) w[i][j]=0;
            else w[i][j] += pattern[i]*pattern[j];
        }
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试以某种类似的模式识别标准模式.当神经元状态停止变化或克服阈值(65535次迭代)时,应停止该过程:

private int[] recognition(int[] pattern){
    int net=0, s, j=0;        
    int[] previousState = new int[n];
    do{
        System.arraycopy(pattern, 0, previousState, 0, n);
        int r = generateRandom(n);
        for(int i=0; i<n; i++)
            net+=pattern[i]*w[i][r];          
        s = signum(net);
        pattern[r] = s;
        j++;
        if(j>iterThreshold){
            System.err.println("Threshold overcome.");
            return pattern;
        }
    }while(!Arrays.equals(pattern, previousState));
    return pattern;
}
Run Code Online (Sandbox Code Playgroud)

signum是一个激活函数:

 private static int signum(int x){ //activation function
    if(x>0) return 1;
    else return -1;

}
Run Code Online (Sandbox Code Playgroud)

识别过程仅在超过阈值时停止.而且模式看起来不像标准模式.请帮忙找出错误.先感谢您.

PS问题解决了.主要的错误是我忘了在循环开始时设置为零'net'变量:

private int[] recognition(int[] pattern){
    int net=0, s, j=0;        
    ...
    do{
        net=0;
        for(int i=0; i<n; i++)
            net+=pattern[i]*w[i][r];
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的关注.

kri*_*anp 4

主要错误是我忘记在循环开始时将“net”变量设置为零:

private int[] recognition(int[] pattern){
    int net=0, s, j=0;        
    ...
    do{
        net=0;
        for(int i=0; i<n; i++)
            net+=pattern[i]*w[i][r];
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)