1

私はPythonでOR関数を分類するための簡単なパーセプトロンを実装しています。しかし、エラーは逆になりません。どんな提案も高く評価されます。OR関数のパーセプトロンは収束しません

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) 

エラープロット:

enter image description here

答えて

3

私はあなたが、バイアスBが欠落していると言うでしょう...

あなたはそれを追加した場合、それは見事に収束します。

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 

から来たその機能はどこ私が知っているように私は、いくつかのより合理的な名前で異なっあなたよりもライブラリをインポート注...それはあなたを助けている場合、私に教えてください...

これは分類の結果です。私は色が意味をなさないことを願って... REdと青は一見派手なものですが、あなたはそのアイディアを得ます。この問題に対する無限の解を見つけることができます。ランダムシードを変更すると、ポイントを線形に分離する別のラインが得られます。

enter image description here

あなたは(0,0)を通るあなたのラインを持っている場合、あなたの予測が間違っているものの、重みは、この特定のポイントのためにvalue=0以降に更新されませんので、また、あなたのアルゴリズムは収束しません。だから問題はあなたのアップデートが何もしないということです。それがエラーの振動の原因です。

EDIT私は、クラシファイアの決定境界を描く方法の例を示す小さなチュートリアル(Jupyterノートブック)を作成しました。あなたはgithubの

githubのリポジトリにそれを見つけることができます:https://github.com/michelucci/python-Utils

は、それが有用であると思います。

EDIT 2:そして、あなたは、迅速かつ非常に汚いバージョン(私は赤と青でプロットするために使用されるものを)したい場合は、ここでのコード

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

であるあなたが、ここでのコードを投稿してくださいでした決定境界?あなたの優れた説明をありがとう! –

+0

こんにちは私は決定境界を描く方法についてのチュートリアルを書いています。お楽しみください:)それはあなたを助けるかどうか私に教えてください。 – Umberto

関連する問題