2017-08-02 16 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() 

上記のコードは本からコピーされていますが、残念ながらエラーはIrisデータでは0に収束していません。エラーは、3.0と2.0の2つの値の間でバウンスしています。 私が間違っている場所を理解するのに役立つ必要があります。PythonのIrisデータが収束しないPerceptronコード

私は機械学習の分野では初心者だと考えてください。どんな洞察も高く評価されます。

答えて

0

私はあなたのコードを見直し、いくつかの問題を見つけました。 私はそれを修正したことを心配しないでください。修正されたコードから、あなたのコード enter image description here

結果から

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() 

結果 enter image description here

関連する問題