パーセプトロンつくった

身の回りで流行っ(n=1)ていて,とある授業で今扱っているパーセプトロンを作ってみた.

 

てきとうにググったら見つかったパーセプトロン説明スライド:http://www.slideshare.net/sleepy_yoshi/tokyonlp5

 

 とりあえずm=2の平面上に赤と青の点をたくさん打ってその境界を求めている様子.

 もぞもぞ動きながら境界を探しているのが分かる.

f:id:utata_kiyoshi:20121028023653g:plain

後述するが,パラメータηというのがあって直線を動かす幅を決めている.

上の実験ではηを固定値にしていた.

初めは大きく動いて具合がよいが,途中から動きすぎて細かい修正が行えていないのが見て取れる.

なので,ηをだんだん減らしていくように改変.

f:id:utata_kiyoshi:20121028024102g:plain

けっこうよさそう.

 

というわけで,ソースコード: http://goo.gl/xui6T

 

以下,てきとうな解説:

問題設定:

m次元空間内に点xがたくさんあって,これらには0か1かのカテゴリーが割り振られている.

ある超平面(2次元なら直線,3次元なら平面)で点たちをカテゴリー別に分けることが出来ると仮定した時,その超平面を求めたい.

 

超平面で分割するので,ある重みベクトルwと定数bをきめて,

 の値の正負でカテゴリーを判別することにする.

(z>0ならカテゴリ1,z<0ならカテゴリ0とした.)

簡単のために,bもベクトルwの一部だとおもうことにして

 と書くことにする.

このwとbを学習したいのだが,まずは一つデータをもってきてzを計算して判別してみる.

正解なら,なにもしない.

不正解なら,ベクトルwをと更新する

(符号は,カテゴリ1のデータに不正解ならプラス,カテゴリ0のデータに不正解ならマイナス)

これをたくさんのデータについて行なってwを少しづつ更新していく.

 

更新の直感的な説明:

f:id:utata_kiyoshi:20121028023702p:plain

重みベクトルwが赤い矢印,それに対応する超平面が青い線で表されている.

いま,☆で表されているデータxがカテゴリ1に属しており,現在の超平面では不正解だったとする.

x(緑の矢印)と並行に少しだけwをずらして(赤の点線)やると,対応する超平面もずれて(青の点線),データxがきちんとカテゴリ1に入るようになる.

直感的にはこんな感じ.