2016-09-20 147 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