2013-04-12 31 views
0

我很努力實現單層感知器:http://en.wikipedia.org/wiki/Perceptron。我的程序取決於權重,要麼丟失在學習循環中,要麼找到錯誤的權重。作爲一個測試用例,我使用邏輯AND。你能否給我一個後驗爲什麼我的感知器不會收斂?這是爲了我自己的學習。謝謝。Perceptron單層

# learning rate 
rate = 0.1 

# Test data 
# logical AND 
# vector = (bias, coordinate1, coordinate2, targetedresult) 

testdata = [[1, 0, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1]] 

# initial weigths 
import random 
w = [random.random(), random.random(), random.random()] 
print 'initial weigths = ', w 

def test(w, vector): 
    if diff(w, vector) <= 0.1: 
     return True 
    else: 
     return False 

def diff(w, vector): 
    from copy import deepcopy 
    we = deepcopy(w) 
    return dirac(sum(we[i]*vector[i] for i in range(3))) - vector[3] 

def improve(w, vector): 
    for i in range(3): 
     w[i] += rate*diff(w, vector)*vector[i] 
    return w 

def dirac(z): 
    if z > 0: 
     return 1 
    else: 
     return 0 

error = True 

while error == True: 
    discrepancy = 0 
    for x in testdata: 
     if not test(w, x): 
      w = improve(w, x) 
      discrepancy += 1 
    if discrepancy == 0: 
     print 'improved weigths = ', w 
     error = False 
+0

也許使用print語句或調試器? – Patashu

+1

更好的問題。 –

回答

1

它看起來像你需要圍繞你的for循環的額外循環迭代改進,直到您的解決方案收斂(步驟3在你鏈接的維基百科頁面)。

現在,你給每個訓練案例一次機會更新權重,所以它沒有機會收斂。

+0

謝謝。我必須重新編寫代碼。 – JackAW

1
  1. 我能看到的唯一的小故障是激活功能。增加截止值,(z > 0.5)
  2. 此外,由於每個時期只有4個輸入案例,因此使用0和1作爲唯一輸出非常困難。嘗試刪除dirac功能並將閾值提高到0.2。學習可能需要更長時間,但會更精確。當然,如果你使用NAND,你並不需要。但它有助於理解。
+0

謝謝。它接縫很容易實現。我開始認爲,也許這是因爲我正在改變體重後的體重,但我應該改變他們的平行。我會玩參數。 – JackAW