Я реализую свой собственный алгоритм персептрона в python без использования numpy или scikit.Я хотел получить основы прямо перед тем, как приступить к машинному обучению конкретных модулей.
Я написал код, приведенный ниже.
- используется набор данных радужной оболочки для классификации на основе длины чашелистика и размера лепестка.
- обновление весов в конце каждого тренировочного набора
- скорость обучения, количествоитерации для обучения, предоставляемые алгоритму от клиента
Проблемы:
Мой алгоритм обучения ухудшается, а не улучшается со временем.Может кто-нибудь объяснить, что я делаю неправильно.
Это моя ошибка, заданная для номера итерации, поскольку вы можете видеть, что ошибка на самом деле увеличивается.
{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