前回に引き続き,ニューラルネットワークです.
前回は,ニューラルネットによる関数近似を行いましたが,今回はちょっとパターン認識寄り.
というのも,2次元平面上のある点が,AとBどちらに分類されるのかという問題なためです.
たとえば,以下の様な状況の場合.
これを2種類に分類したいとします.
理想的な場合,このように分類できると想像できると思います.
先ほどの4点を与えたとき,大体の人はこのように線を引いて分けると思います.
このような1本の線では分離ができない問題のことを,線形分離不可能な問題と言ったりします.
線形分離可能な例はこんな感じ.
1本の直線で,分類できています.
線形分離可能な問題は,単純パーセプトロンなどでも解けますが,線形分離不可能の場合には,隠れ層を持つようなニューラルネットワークの構成である必要があります.
このような隠れ層を持つニューラルネットワークの学習方法のひとつが,誤差逆伝播法(Back Propagation)です.
というわけで,2次元での分類を行っていきます.
まず,2次元の入力(x軸,y軸)に対して出力(●,×)があるので,入力次元は2,出力次元は1です.
data.dat | rho.dat | |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
まずは,線形分離可能なパターンから試してみます.
ここで,data.dat
の左側がx軸,右側がy軸で,rho.dat
の0が●,1が×を表しています.
よって,このデータは先ほどの直線で分離できるデータを数字で表したものとなっています.
これをニューラルネットワークに入力として与えると,以下のようになります.
このように,確りと分離できていることがわかります.
プログラム中では,positive.dat
に0.5以上(厳密には超過)の出力群を,negative.dat
に0.5以下の出力群をファイル出力しています.
次に,線形分離不可能の場合.
data.dat | rho.dat | |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
これは最初の図に対応します.
このときの出力は,以下のようになります.
左下と右上で,×になっています.
ここからわかるように,非線形の分離問題(EX-OR問題)に対しても分離を行えていることがわかります.
プログラムリストは,前回の物から少し変えてあります.(主にTest関数内)
以下リスト.