Adaline学习算法

时间:2016-09-20 22:03:13

标签: python machine-learning neural-network

我似乎无法调试以下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()

我是否也需要阈值函数的导数?见上面的注释。

1 个答案:

答案 0 :(得分:0)

没有什么不对,但是:

  1. 你在两个循环中使用“i”作为迭代器,在这段代码中它没关系,因为你没有真正在外循环中使用它,但它可能会导致非常一般来说是个讨厌的错误。

  2. 您的伽玛值太高,请将其更改为0.01

  3. 不绘制带符号的错误,adaline正在最小化平方误差因此您应该绘制error = (target - y)**2;你甚至可以准确地看到它与error = target != np.sign(y)区别对待。

  4. after changes