ここで公開されてる3章のMulti Layer Perceptronを使う。実行はipythonで。
A Regression Problem
- シンプルな関数を使ってサンプル集合を生成し、そのサンプル集合が生成された関数を学習により得る
- 例ではsin関数
Step by Step
1. データセットを作る
x = ones((1,40))*linspace(0,1,40) t = sin(2*pi*x) + cos(4*pi*x) + random.randn(40)*0.2 x = transpose(x) t = transpose(t)
2. 訓練データ、テストデータ、検証データに分ける
40点のデータ集合を50:25:25に分割して、それぞれを訓練データ(20)、テストデータ(10)、検証データ(10)とする。
train = x[0::2,:] test = x[1::4,:] valid = x[3::4,:] traintarget = t[0::2,:] testtarget = t[1::4,:] validtarget = t[3::4,:]
3. 学習
入力層のノード数1で、隠れ層のノード数3のMLPで、一定回数(ここでは101)の重みの更新を実行する。outtype='logistic'は、活性化関数としてシグモイド関数を使うためのパラメータ指定。(学習アルゴリズムの式の導出はきちんとまとめておきたいところ)
import mlp net = mlp.mlp(train, traintarget, 3, outtype='logistic') net.mlptrain(train, traintarget, 0.25, 101)
4.学習結果
一定回数毎に誤差を表示してみると、確かに誤差が減少していて学習しているというのはわかるが、Iteration10以降は逆に微増になってる。これは、データ数が少ないせいなのか、どれかのパラメータの問題なのか、試してみないといけないな…(まだこのあたりの感覚はないのは課題だ)
Iteration: 0 Error: 21.6186313767 Iteration: 10 Error: 18.7424095681 Iteration: 20 Error: 18.7424187477 Iteration: 30 Error: 18.7424188805 Iteration: 40 Error: 18.7424188975 Iteration: 50 Error: 18.7424189017 Iteration: 60 Error: 18.7424189031 Iteration: 70 Error: 18.7424189035 Iteration: 80 Error: 18.7424189037 Iteration: 90 Error: 18.7424189037 Iteration: 100 Error: 18.7424189037