2016-09-20 149 views
0

我似乎無法調試Adaline神經元的以下實現...我希望有人可以發現我不能。我認爲問題在於我的訓練方法的最後幾行?Adaline學習算法

from numpy import random, array, dot 
import numpy as np 
import matplotlib.pyplot as plt 
from random import choice 
import math 
import sympy 

class adalineANN(object): 
    def __init__(self, gamma=.2, trials=500, errors=[], weights=[]): 
     self.gamma = gamma 
     self.trials = trials 
     self.errors = errors 
     self.weights = weights 

def train(self): 
    self.weights = random.rand(3) 

    coordinates_class1 = [] 
    coordinates_class2 = [] 

    for x in np.random.normal(2, .5, 20): 
     for y in np.random.normal(3, .5, 20): 
      coordinates_class1.append(([x, y, 1], 1)) 
      break 

    for x in np.random.normal(2, .25, 20): 
     for y in np.random.normal(-1, .25, 20): 
      coordinates_class2.append(([x, y, 1], -1)) 
      break 

    trainingData = coordinates_class1 + coordinates_class2 

    for i in range(self.trials): 
     x, target = choice(trainingData) 
     y = np.dot(x, self.weights) 
     error, errors = [], [] 
     error = (target - y) 
     self.errors.append(error) 
     for i in range(0, 3): 
      self.weights[i] += self.gamma * x[i] * (target - y) #????* (sympy.cosh(y)**(-1))**2 

def plot(self): 
    plt.plot(self.errors) 
    plt.show() 


A = adalineANN() 
A.train() 
A.plot() 

我是否也需要我的閾值函數的導數?見上面的註釋。

回答

0

沒有什麼真正錯的是,但是:

  1. 您正在使用「我」爲循環迭代,在這段代碼也沒關係,因爲你真的不外使用循環,但它可能會導致一般非常討厭的錯誤。

  2. 你伽馬過高,將其更改爲0.01

  3. 不積簽署錯誤,Adaline的是儘量減少方誤差因此,你應該繪製error = (target - y)**2;你甚至可以準確地看出它與error = target != np.sign(y)的區別很好。

after changes