2017-08-02 4 views
0
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

class Perceptron(object): 
    def __init__(self, eta=0.01, n_iter=10): 
     self.eta = eta 
     self.n_iter = n_iter 

    def fit(self, X, y): 
     self.w_ = np.zeros(1 + X.shape[1]) 
     self.errors_ = [] 

     for _ in range(self.n_iter): 
      errors = 0 
      for xi, target in zip(X, y): 
       update = self.eta * (target - self.predict(xi)) 
       self.w_[1:] += update * xi 
       self.w_[0] += update 
       errors += int(update != 0.0) 
      self.errors_.append(errors) 
     return self 

    def net_input(self, X): 
     """Calculate net input""" 
     return np.dot(X, self.w_[1:]) + self.w_[0] 

    def predict(self, X): 
     """Return class label after unit step""" 
     return np.where(self.net_input(X) >= 0.0, 1, -1) 


df = pd.read_csv('D:\\TUT\\IRIS_DATA\\iris_data.csv', header=None) 
print(df.tail()) 
y = df.iloc[0:100, 4].values 
#print(y) 

y = np.where(y == 'Iris-setosa', -1, 1) 
#print(y) 

X = df.iloc[0:100,0:2].values 
print(X) 

plt.scatter(X[:50, 0], X[:50,1], label='setosa', color='red', marker='o') 
plt.scatter(X[50:100,0], X[50:100, 1], label='versicolor', color='blue',marker='x') 
plt.xlabel('petal length') 
plt.ylabel('sepal length') 
plt.legend() 
plt.show() 

ppn = Perceptron(0.01, 100) 
ppn.fit(X,y) 
plt.plot(range(1,len(ppn.errors_)+1), ppn.errors_, marker='o') 
plt.xlabel('epoch') 
plt.ylabel('Number of misclassification') 
plt.show() 

Le code ci-dessus est copié à partir d'un livre mais malheureusement l'erreur ne converge pas vers 0 sur les données Iris. L'erreur rebondit entre deux valeurs 3.0 et 2.0. Besoin d'aide pour comprendre où je me trompe.Perceptron Code en Python sur les données Iris non convergentes

S'il vous plaît considérez-moi un novice dans l'arène d'apprentissage automatique et toute idée serait très appréciée.

Répondre

0

Je viens d'examiner votre code et j'ai découvert quelques problèmes. Ne vous inquiétez pas, je l'ai corrigé.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

class Perceptron(object): 
    def __init__(self, eta=0.01, n_iter=10): 
     self.eta = eta 
     self.n_iter = n_iter 

    def fit(self, X, y): 
     self.w_ = np.zeros(1 + X.shape[1]) 
     self.errors_ = [] 

     for _ in range(self.n_iter): 
      errors = 0 
      for xi, target in zip(X, y): 
       update = self.eta * (target - self.predict(xi)) 
       self.w_[1:] += update * xi 
       self.w_[0] += update 
       errors += int(update != 0.0) 
      self.errors_.append(errors) 
     return self 

    def net_input(self, X): 
     """Calculate net input""" 
     return np.dot(X, self.w_[1:]) + self.w_[0] 

    def predict(self, X): 
     """Return class label after unit step""" 
     return np.where(self.net_input(X) >= 0.0, 1, -1) 


df = pd.read_csv('iris.csv', header=None) 
print(df.tail()) 
y = df.iloc[0:100, 4].values 
#print(y) 

y = np.where(y == 'Iris-setosa', -1, 1) 
#print(y) 

X = df.iloc[0:100,[0,2]].values 
print(X) 

plt.scatter(X[:50, 0], X[:50,1], label='setosa', color='red', marker='o') 
plt.scatter(X[50:100,0], X[50:100, 1], label='versicolor', color='blue',marker='x') 
plt.xlabel('petal length') 
plt.ylabel('sepal length') 
plt.legend() 
plt.show() 

ppn = Perceptron(0.1, 10) 
ppn.fit(X,y) 
plt.plot(range(1,len(ppn.errors_)+1), ppn.errors_, marker='o') 
plt.xlabel('epoch') 
plt.ylabel('Number of misclassification') 
plt.show() 

Résultat de votre code enter image description here

Résultat code corrigé enter image description here