2017-12-22 3 views
2

Ich bin naiv in Machine Learning, nach Lehrbuch (Python Machine Learning) und Online-Kurs auf Kurs. Ich versuche nur zwei Klassen (‚sentosa‘ und ‚versicolor‘), aber Fehlerfunktion konvergiert nicht .Hier mit einzelnem Perzeptron-Algorithmus auf Standard-Iris-Datensatz zu implementieren ist mein Code: -Kostenfunktion konvergiert nicht

import numpy as np 
from sklearn import datasets 
import matplotlib.pyplot as plt 

class perceptron(object): 

    def __init__(self,a,iter): 

     self.a=a 
     self.iter=iter 

    def fit(self,x,y): 

     self.w_=np.zeros(1+x.shape[1]) 
     self.errors_=[] 
     for i in range(self.iter): 
      errors = 0 
      for xi ,target in zip(x,y): 
       update=self.a*(target-self.predict(xi)) 
       self.w_[1:]=xi*update 
       self.w_[0]=update 
       errors+=int(update != 0.0) 
      self.errors_.append(errors) 
      print(self.errors_) 
     return self 

    def net_input(self,x): 

     return np.dot(x,self.w_[1:]) 

    def predict(self,x): 

     return np.where(self.net_input(x)>=0.0,1,-1) 


iris=datasets.load_iris() 
x=iris.data[:100,:2] 
y=iris.target 
y=np.where(y==0,-1,1) 
ppn=perceptron(a=0.01,iter=10) 
ppn.fit(x,y) 
plt.plot(range(1, len(ppn.errors_) + 1),ppn.errors_,marker='_') 
plt.xlabel('epochs') 
plt.ylabel('number of classification') 
plt.show() 

Anzahl der Fehlklassifikation (Fehler) bleibt dieselbe in jeder Iteration

Antwort

2

Diese Linien sind falsch:

self.w_[1:]=xi*update 
self.w_[0]=update 

ändern sie:

self.w_[1:] += update * xi 
self.w_[0] += update 

Es ist auch wie Sie Ihre Eingabe Implementierung aussieht, ist falsch:

def net_input(self,x): 
    return np.dot(x,self.w_[1:]) 

werden sollten:

return np.dot(X, self.w_[1:]) + self.w_[0] 

Sie können die vollständige Umsetzung auf meinem github

Lassen Sie mich sehen, ob das doesn‘ t lösen Sie Ihr Problem.

+0

Es hat sehr gut funktioniert, vielen Dank – navlearner

Verwandte Themen