2012-02-13 38 views
8

我想用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]; 
     } 
} 

然後我試圖識別在一些類似的模式的標準模式。該方法應當神經元的狀態停止改變被停止或當閾值(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; 
} 

正負號是激活函數:僅當閾值被傳遞

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

} 

識別過程停止。出模式看起來不像標準模式。請幫助找到錯誤。 預先感謝您。

P.S.問題已經解決了。 主要錯誤是,我忘了設置爲零「網」變量週期的開始:

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

感謝您的關注。

+0

我想的Java已經有了'Math.signum(X)'爲double和float輸入法X?如果x = 0,您的版本將忽略零(0)。請參閱鏈接http://en.wikipedia.org/wiki/Signum_function – 2012-02-13 01:46:17

+0

我的版本不會忽略x = 0。當x = 0時,signum(x)= - 1。模式向量只能由「1」或「-1」值組成。 – user1020946 2012-02-13 14:15:52

+0

你有沒有機會參加Hinton的神經網絡課程? – Nayuki 2012-02-28 01:42:08

回答

3

主要錯誤是,我忘了設置爲零「網」變量週期的開始:

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