2016-05-14 3 views
2

I mit 3 Eingängen, ein einfaches Perceptron bin den Aufbau (x, y, Bias = 1)Neural Network: A Perceptron für die Position eines Punktes relativ zu einem Funktions Erraten

Er muß den gegebenen Punkt erraten, ob (x , y) ist unter oder unter eine bestimmte Funktion.

Grundsätzlich ist es von this article

Ein betreuter Lernmodell inspiriert wurde verwendet, um das Netzwerk zu trainieren und die Formel ist die folgende:

learningConst = 0.01 
error = desired - neuralAnswer 
new_weights[i] = old_weights[i] + error * inputs[i] * learningConst 

Noch nach Tests Ausbildung macht es Fehler auch auf eine einfache Funktion (2x + 1)

Hier ist der Code:

import numpy as np 
import matplotlib.pyplot as plt 

class Perceptron: 
    def __init__(self, n): 
     self.n = n #n is 2 in this case. 2 inputs [ x, y ] 
     self.weights = [np.random.uniform(-1, 1) for x in range(n)] 
     self.learningConstant = 0.05 

    # 1 added to the sum is the bias input  
    def feedForward(self, inputs): 
     return 1 + sum([self.weights[i]*inputs[i] for i in range(self.n)]) 

    def activate(self, result): 
     if result >= 0: 
      return 1 
     elif result < 0: 
      return -1 

    def train(self, inputs, expected): 
     prediction = self.feedForward(inputs) 
     answer = self.activate(prediction) 
     error = expected - answer 

     self.weights = [ 
      self.weights[i] + error * inputs[i] * self.learningConstant 
      for i in range(self.n) 
     ] 
     #print(self.weights) 

    def predict(self, inputs): 
     prediction = self.feedForward(inputs) 
     return self.activate(prediction) 

Sie können hier die Ergebnisse sehen. Grüne Farbe zeigt an, dass das Perzeptron es richtig erkannt hat und die roten zeigen die Fehler an. Lustige Sache - es neigt dazu, auf Punkte unterhalb der Linie zu verwechseln.

Was soll ich tun, um das Programm zu verbessern?

Perceptron results

der vollständige Code: CLICK

SOLUTION

Mein Problem der Bias-Eingang als Brute-Konstante (Linie 14 des vollständigen Code) unter Verwendung von ohne dass der Algorithmus, um darauf zu lernen. Also sind meine Eingaben jetzt [bias, x, y] und die Gewichte sind [w1, w3, w3] - der Bias-Eingang hat nun sein Gewicht.

Eine andere gute Idee ist, die Gewichte irgendwo anders zu speichern, so dass der Algorithmus nicht bei jedem Test des Programms neu beginnen muss.

2x + 1 Image

x^2 - 2x + 1 enter image description here

+1

Ich sehe nicht den Punkt der Verwendung von 'numpy' nur um Zufallszahlen zu erzeugen ... benutze numpy Arrays und Vektoroperationen:' self.weights = np.random.uniform (-1, 1, size = n) 'und auch' np.sum (self.weights * inputs) 'und' self.weights = self.weights + error * inputs * self.learningConstant'. – Bakuriu

+1

Kannst du bitte den Code posten, der auch dein 'Perceptron' benutzt, damit ich es nicht machen muss :) – bakkal

Antwort

1

Das Hauptproblem mit Ihrer Lösung ist, dass Ihre Verzerrung immer 1 ist. Es ist kein Parameter - es ist konstant. Dies könnte ein Problem sein, da Ihr Modell wesentlich schwächer ist als das klassische Perzeptronmodell.

+0

Das ist eine gute Idee! Die Bias-Eingabe könnte die Antwort ändern. Aber sollte das neuronale Netz seine Gewichte nach einigen Tests nicht an den Bias-Eingang anpassen? –

+1

Ja, sollte es, aber egal wie sie Ihre Voreingenommenheit anpassen, wird immer positiv sein. Dies kann Ihrer Vorhersage ernsthaft schaden. –

+0

Wie soll ich es ändern? Ich habe versucht, es abzunehmen und es auf 0.01 zu verringern - praktisch keine Wirkung –

0

Seien Sie sicher, dass die Daten, die Sie wünschen linear trennbar zu klassifizieren ist oder der Perzeptron-Lernalgorithmus wird nie konvergieren .

+0

Ich benutze den Fehler überhaupt nicht. Wie wird es lernen? –

+0

Wie erzeuge ich eine linear trennbare Menge zufälliger Punkte? –

+0

Sie sollten ein falsch klassifiziertes Beispiel zufällig auswählen und das Gewicht mit der Antwort aktualisieren (was falsch ist). In der Tat, wenn Sie für jedes Beispiel multiplizieren, wird es nicht funktionieren. – Octoplus

Verwandte Themen