Персептрон со стохастическим градиентным спуском - почему алгоритм обучения ухудшается с помощью итерации? - PullRequest
0 голосов
/ 27 сентября 2018

Я реализую свой собственный алгоритм персептрона в python без использования numpy или scikit.Я хотел получить основы прямо перед тем, как приступить к машинному обучению конкретных модулей.

Я написал код, приведенный ниже.

  1. используется набор данных радужной оболочки для классификации на основе длины чашелистика и размера лепестка.
  2. обновление весов в конце каждого тренировочного набора
  3. скорость обучения, количествоитерации для обучения, предоставляемые алгоритму от клиента

Проблемы:

Мой алгоритм обучения ухудшается, а не улучшается со временем.Может кто-нибудь объяснить, что я делаю неправильно.

Это моя ошибка, заданная для номера итерации, поскольку вы можете видеть, что ошибка на самом деле увеличивается.

{0: 0.01646885885483229, 1: 0.017375368112097056,2: +0,018105024923841584, 3: +0,01869233173693685, 4: +0,019165059856726563, 5: +0,01954556263697238, 6: +0,019851832477317588, 7: +0,02009835160930562, 8: 0,02029677690109266, 9: 0,020456491062436744}

import pandas as panda
import matplotlib.pyplot as plot 
import random

remote_location = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'

class Perceptron(object):

    def __init__(self, epochs, learning_rate, weight_range = None):
        self.epochs = epochs
        self.learning_rate = learning_rate
        self.weight_range = weight_range if weight_range else [-1, 1]
        self.weights = []
        self._x_training_set = None
        self._y_training_set = None
        self.number_of_training_set = 0        

    def setup(self):

        self.number_of_training_set = self.setup_training_set()
        self.initialize_weights(len(self._x_training_set[0]) + 1)

    def setup_training_set(self):
        """

        Downloading training set data from UCI ML Repository - Iris DataSet

        """

        data = panda.read_csv(remote_location)       

        self._x_training_set = list(data.iloc[0:, [0,2]].values)
        self._y_training_set = [0 if i.lower()!='iris-setosa' else 1 
                                    for i in data.iloc[0:, 4].values]

        return len(self._x_training_set)

    def initialize_weights(self, number_of_weights):
        random_weights = [random.uniform(self.weight_range[0], self.weight_range[1]) 
                                for i in range(number_of_weights)]
        self.weights.append(-1) # setting up bias unit 
        self.weights.extend(random_weights)

    def draw_initial_plot(self, _x_data, _y_data, _x_label, _y_label):

        plot.xlabel(_x_label)
        plot.ylabel(_y_label)
        plot.scatter(_x_data,_y_data)
        plot.show()

    def learn(self):

        self.setup() 
        epoch_data = {}
        error = 0

        for epoch in range(self.epochs):

            for i in range(self.number_of_training_set):
                _x = self._x_training_set[i]
                _desired = self._y_training_set[i]
                _weight = self.weights
                guess = _weight[0] ## setting up the bias unit

                for j in range(len(_x)):
                    guess += _weight[j+1] * _x[j]

                error = _desired - guess

                ## i am going to reset all the weights
                if error!= 0 :

                    ## resetting the bias unit
                    self.weights[0] = error * self.learning_rate

                    for j in range(len(_x)):
                        self.weights[j+1] = self.weights[j+1] + error * self.learning_rate * _x[j]

            #saving error at the end of the training set        
            epoch_data[epoch] = error

        # print(epoch_data)

        self.draw_initial_plot(list(epoch_data.keys()), list(epoch_data.values()),'Epochs', 'Error')

def runMyCode():
    learning_rate = 0.01
    epochs = 15
    random_generator_start = -1
    random_generator_end = 1
    perceptron = Perceptron(epochs, learning_rate, [random_generator_start, random_generator_end])
    perceptron.learn()

runMyCode()        

участок с эпохи 6 * +1023*

сюжет с эпохой> 6

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

я разобрался в проблеме.я неправильно строил функцию ошибки.

ошибка градиентного спуска равна квадрату ошибки / поэтому код должен быть:

epoch_data [epoch] = ошибка

как только я это сделалчто построение функции эпохи и стоимости всегда сходилось к нулю, независимо от количества эпох.

0 голосов
/ 27 сентября 2018

Действительно странно, так как я просто запустил ваш код (как есть) и получил следующий график:

enter image description here

Можете ли вы уточнить, где вывидите эту ошибку?может быть, вы читаете это в обратном порядке.

...