ニューラルネットワークが簡単に実装できるライブラリ(Neurolab)がPythonにあるのを見つけたので、テストしてみました。
環境 :
IPython QtConsole 3.1.0 / Python 2.7.9 / Windows 8.1
(WinPython-64bit-2.7.9.5.exeをインストールした後、site-packagesに neurolab-0.3.5 を展開)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import math import numpy as np import matplotlib.pyplot as plt import neurolab as nl x = np.arange( - math.pi, math.pi, 0.1 ) vfunc = np.vectorize( lambda x:math.sin(x)) y = vfunc(x) plt.plot(x,y) input = x.reshape( len (x), 1 ) target = y.reshape( len (y), 1 ) net = nl.net.newff([[ - math.pi, math.pi]],[ 5 , 1 ]) error = net.train( input , target, epochs = 50 , goal = 0.02 ) output = net.sim( input ) plt.plot( input ,output) plt.plot(error) net2 = nl.net.newff([[ - math.pi, math.pi]],[ 5 , 1 ]) error2 = net2.train( input , target, epochs = 50 , goal = 4 ) output2 = net2.sim( input ) plt.plot( input ,output2) plt.plot(error2) |
2-in 1-outの例はよく見るのですが、1-in 1-outの例の方がグラフ上わかりやすいのでこちらにしました。
sin関数の入力と出力をgoal=0.02になるまで学習します。
学習時と同じ入力を与え、シミュレーション結果を得ます。targetに近い出力になります。
次はgoal=4までの学習で、シミュレートしてみます。上より乱れた結果になりました。
機械学習ってプログラム言語や数式でみたりすると難しく感じるのですが、このようなライブラリがあると、理解の助けになります。
参考のサイトにもありますが、2-in 1-outの例などは、自分で独自ロジックを作ったことがありました。ニューロンなどという高度な考え方はできませんでしたが、過去に経験したことをマトリックス上に重みづけすることにより確率的に次回選択しやすくするようなものです。(ゲームなどの学習機能で利用) ニューラルネットワークなどという言葉すら当時知らなかったのですが、要件にあった動作をするように手さぐりで作っていました。
機会学習とはちがいますが、Steganographyもその言葉が流通する前に、そのプロクラムを作っていました。CD-ROMのゲームでCD-DA部分にデータを埋めこんだことがあります。昔のゲーム機やAmigaというコンピュータのメガデモなど、チープなハードで極限までパフォーマンスを引き出すために数学的にもいろんなアイディアが使われています。
当時、今みたいにネットで調べることができなかったり、ライブラリなどない状態で、必要に迫られて一から一人ですべてつくるため、オリジナリティあふれる様々な手法が編み出されました。最近では、このような開発手法をとることは少ないですが、場合によって威力を発揮することがあります。
このIPythonのようなグラフが埋め込まれて出力されるインターフェイス、とても好きです。Mathematica,DrRacket/Scheme、最新のPlayground/Swiftでも使われていますが、このような数値計算をグラフ表示するのにとても使いやすいです。どれを使うかは、どんな言語を選ぶか、ではなくどんなライブラリがあるか、になると思います。
参考:
https://code.google.com/p/neurolab/
https://pythonhosted.org/neurolab/ex_newff.html