1

Ich implementiere ein einfaches Perzeptron für die Klassifizierung von OR-Funktion in Python. Der Fehler spricht jedoch nicht. Jeder Vorschlag würde sehr geschätzt werden.Perzeptron für OR-Funktion konvergiert nicht

def activation_function(x): 
    if x<0: 
     return 0 
    else: 
     return 1 

training_set = [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 1)] 

w = random.rand(2) 
errors = [] 
eta = .2 
n = 100 

for i in range(n): 
    for x, y in training_set: 
     u = sum(x*w)   
     error = y - activation_function(u)  
     errors.append(error) 

     for index, value in enumerate(x): 
      w[index] += eta * error * value 

ylim([-1,1]) 
plot(errors) 

Fehler Grundstück:

enter image description here

Antwort

3

Ich würde sagen, Sie die Bias b fehlen ...

Wenn Sie es hinzufügen, es konvergiert schön.

enter image description here

import numpy as np 
import matplotlib.pyplot as py 

np.random.seed(42) 
w = np.random.rand(2) 
b = 0 
errors = [] 
eta = .2 
n = 10 

for i in range(n): 
    for x, y in training_set: 
     u = np.sum(x*w)+b  
     error = y - activation_function(u)  
     errors.append(error) 

     for index, value in enumerate(x): 
      #print(index, " ", value) 
      w[index] += eta * error * value 
      b += eta*error 

Bitte beachte, dass ich die Bibliothek anders mit etwas angemesseneren Namen als Sie importiert, so dass ich weiß, wo die herkommen funktionieren ... Lassen Sie mich wissen, ob das Ihnen hilft ...

Und das ist übrigens das Ergebnis der Klassifizierung. Ich hoffe, dass die Farben einen Sinn ergeben ... REd und Blau sind irgendwie auffällig, aber du hast die Idee. Beachten Sie, dass Sie für dieses Problem unendliche Lösungen finden können. Wenn Sie also den Zufallssatz ändern, erhalten Sie eine andere Linie, die Ihre Punkte linear trennt.

enter image description here

Zusätzlich Ihr Algorithmus konvergiert nicht da, wenn Sie Ihre Linie haben, die durch (0,0), obwohl Ihre Vorhersage falsch ist, werden die Gewichte nicht da value=0 für diesen speziellen Punkt aktualisiert werden. Das Problem ist also, dass Ihr Update nichts bewirkt. Das ist der Grund der Oszillationen deines Fehlers.

BEARBEITEN wie gewünscht Ich schrieb ein kleines Tutorial (ein Jupyter Notebook) mit einigen Beispielen, wie man die Entscheidungsgrenze eines Klassifikators zeichnet. Sie können es auf Github finden

Github-Repository: https://github.com/michelucci/python-Utils

Hoffe, dass es nützlich ist.

EDIT 2: Und wenn Sie die schnelle und sehr schmutzig Version wollen (die, die ich für das Grundstück in rot und blau verwendet) hier ist der Code

lim = 3.0 
X1 = [x1 for x1 in np.arange(-lim,lim,0.1)] 
X2 = [x2 for x2 in np.arange(-lim,lim,0.1)] 
XX = [(x1,x2) for x1 in np.arange(-lim,lim,0.1) for x2 in np.arange(-lim,lim,0.1)] 
Xcolor = ["blue" if np.sum(w[0]*x1+w[1]*x2)+b > 0 else "red" for x1 in X1 for x2 in X2] 
x,y = zip(*XX) 
py.scatter(x,y, c = Xcolor) 
py.scatter(0,0, c = "black") 
py.scatter(1,0, c = "white") 
py.scatter(0,1, c = "white") 
py.scatter(1,1, c = "white") 
py.show() 
+0

Könnten Sie bitte hier nach dem Code für die Entscheidungsgrenze? Vielen Dank für Ihre ausgezeichnete Erklärung! –

+0

Hallo Ich habe ein Tutorial geschrieben, wie man die Entscheidungsgrenze zeichnet. Viel Spaß :) Lass es mich wissen, wenn es dir hilft. – Umberto

Verwandte Themen