Проблема с однослойной реализацией персептрона

#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 . Он содержит демонстрационный код для построения границы решения игрушечных нейронных сетей на плоскости. Вы можете соответствующим образом адаптировать его к своему использованию.