#python #numpy #matplotlib #plot #neural-network
#python #numpy #matplotlib #график #нейронная сеть
Вопрос:
Вот код моего персептрона, который я реализовал с помощью Python и Numpy:
import numpy
class Perceptron:
def __init__(self, features, labels, weights, eta, threshold, bias, epochs):
self.features = features
self.labels = labels
self.weights = weights
self.eta = eta
self.threshold = threshold
self.bias = bias
self.epochs = epochs
def unit_step_function(self, output):
if output > self.threshold:
return 1
else:
return 0
def calculate_error(self, d, y):
return d - y
def start_training_message(self):
print("-" * 39)
print("| Initializing training...")
print("-" * 39)
def finished_training_message(self):
print("| Training completed.")
print("-" * 39)
def compute(self):
output = 0
self.start_training_message()
for epoch in range(1, (self.epochs 1)):
learned = 0
print("| Epoch: {}".format(epoch))
for x in range(0, self.features.shape[0]):
output = numpy.sum(numpy.dot(self.features[x], self.weights[x])) self.bias
prediction = self.unit_step_function(output)
error = self.calculate_error(self.labels[x], prediction)
learned = learned abs(error)
print("| Prediction: {} | Output: {} | Error: {}".format(prediction, self.labels[x], error))
self.weights[x] = self.weights[x] self.eta * (error * self.features[x][0])
print("-" * 39)
if learned == 0:
self.finished_training_message()
break
if __name__ == "__main__":
features = numpy.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1], [1, 1, 0]])
labels = numpy.array([0, 0, 0, 1, 0]).T
weights = numpy.array([0.2, 0.4, 0.4, 0.2, 0.6])
eta = 0.5
threshold = 0.5
bias = 1
epochs = 50
perceptron = Perceptron(features, labels, weights, eta, threshold, bias, epochs)
perceptron.compute()
И его вывод:
---------------------------------------
| Initializing training...
---------------------------------------
| Epoch: 1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 2
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 3
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 4
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 5
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 6
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 7
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 8
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 9
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 1 | Output: 0 | Error: -1
---------------------------------------
| Epoch: 10
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 0 | Error: -1
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 11
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 12
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 13
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 14
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 15
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 16
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 17
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 18
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 19
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 20
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 21
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 22
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 23
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 24
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 1 | Error: 1
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Epoch: 25
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
| Prediction: 1 | Output: 1 | Error: 0
| Prediction: 0 | Output: 0 | Error: 0
---------------------------------------
| Training completed.
---------------------------------------
Я хочу создать график, подобный этому (я знаю, что мне нужно использовать matplotlib и использовать scatter для построения такого же графика. Проблема в том, что каждый раз, когда я пытался, я не мог получить график изображения ниже):
Комментарии:
1. Итак, по сути, вы хотите построить границу принятия решения вашего персептрона, не так ли?
2. @swag2198 Точно!
3. Ну, вы, конечно, не можете построить границу решения на плоскости, когда у вас есть объекты, имеющие размеры> 2. В вашем случае ваши векторы объектов являются трехмерными, поэтому сначала вам нужно каким-то образом спроецировать их на плоскость (через
PCA
или другие). Тогда идея заключается в том, что вы берете квадратную область и генерируете близко расположенные точки внутри нее, прогнозируете выходные данные модели в каждой точке и окрашиваете ее по-разному на основеlabel
. Вот как вы можете получить оценку границы решения в плоскости.4. Также вы можете пройти этот урок: cs231n.github.io/neural-networks-case-study . Он содержит демонстрационный код для построения границы решения игрушечных нейронных сетей на плоскости. Вы можете соответствующим образом адаптировать его к своему использованию.