パーセプトロンのアルゴリズム(pythonその2)



スポンサードリンク

前回までで、パーセプトロンの理論的な背景と、そのデータセットの用意のところまではすでに説明し終えたので、その続きから説明していきます。

>>>全体のソースコードがみたい方は前回の記事をみてください。

>>>パーセプトロンの理論的な背景についての記事

パーセプトロンのアルゴリズム(確率的勾配降下法)

w0,w1,w2の初期値は全て0で始めていますね。

biasの部分は少し説明する必要があります。


スポンサードリンク

バイアス項とは何か?

バイアス項とはベクトル\(\phi_n\)の第一成分です。

ベクトル\(\phi_n\)の説明については以下の記事を読んでください

>>>パーセプロトンのアルゴリズム(線形分離)

求める直線の方程式を
\begin{eqnarray}
f(x,y) = w_{0}+w_{1}x+w_{2}y
\end{eqnarray}
とおきましたが、
\begin{eqnarray}
f(x,y) = cw_{0}+w_{1}x+w_{2}y
\end{eqnarray}
と仮定することもできます。この場合、ベクトル\(\phi_{n}\)のバイアス項は「c(任意定数)」になります。

ベクトルwの更新には\(t_{n}\phi_{n}\)が用いられますので、w0は±cだけ更新されることになります。

なので、このcを適切に選択すれば、アルゴリズムの収束速度を改善できるということになります。

上のコードではこのcの値(biasの部分)をデータに含まれる全てのxn,ynの平均値を使っています。

なぜ平均値をとるのか

データの値(xn,yn)がとてつもなく大きい数(1000とか10000)で、平均的に10000とかの場合、勾配降下法のアルゴリズムより、w1,w2も10000程度の大きさで一気に増減します。

もしバイアス項が”1″ならw0の値は更新されても±1でしか変化しないことになります。

w0の変化がw1,w2の変化に比べて小さすぎるので、正しいwが得られるのに時間がかかります。

そこでバイアス項もデータの平均的な値にすることで、w0の変化率もw1,w2と同等にしてやろうという意味です。

Iteration

Iterationはベクトルwの更新回数です。今回は30回です。

ここはそんなに説明する必要はないと思います。

前々回の記事で説明した理論的な計算をおこなっている部分です。要は「更新」作業の一番の根幹の部分です。

判定誤差の計算

分散が大きい場合と小さい場合での比較として、エラー率を計算しています。

前にも述べましたが、分散が小さい場合は綺麗に直線で二つのデータ群を分割できますが、分散が大きいと二つのデータ群に重なる領域が生まれますので、直線で分割することができなくなります。

30回更新し直しても、直線で分割したエリアとは違うエリアにデータが含まれている場合、それをエラー率として表示するようにしています。

結果の表示、2種類の分散での実行

ここはグラフを作るだけですので、特に問題ないと思います。

最後のfor文以降で、”2種類の分散”でこれまでの全ての計算を実行するようにしています。

忘れたかもしれませんがVariance(分散)は最初に配列で設定していますね。


スポンサードリンク

計算結果

上が計算結果です。

分散が小さい方(左上)は綺麗に直線で分割できます。その証拠にw0,w1,w2の更新も7回目くらいで収束しているのがわかります(左上)。

分散が大きい方(右上)は更新を30回やっても直線で綺麗に分割することはできず、エラー率6パーセントになっています。

実際、●のある領域に×のデータが入り混んでいます。エラーが出ているということは、30回更新してもw0,w1,w2は収束していないことが右下のグラフからわかります。

以上、パーセプトロンのアルゴリズムについて理論と実際にコードを用いてどのように計算されているのか述べてきました。

データセットの用意は乱数を用いているので、計算するたびに結果が異なります。更新回数や、データ数等変えて遊んでみてください。

 

 

記事が役に立ったらシェア!

投稿者:

中村 俊

中村 俊

1993/09/04生まれ。機械系大学院を休学し、ベンチャーでインターンしている最中。直近では、デカルトの「方法序説」に感銘を受けた。 趣味:読書、web開発の勉強、異分野の論文読んだり、記事書いたり。 最終的には経営者か研究者になりたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA