実体と情報のはざま

何事にも囚われず。

Pythonでニューラルネットワークを使った単回帰分析(関数近似)

 前回は苦労したけどエクセルからデータを読み出すことができるようになった。
 今回はこれを生かして、以前の記事で試した「ExcelVBAで関数近似」を覚えたてのPythonでやってみようと思う。最も単純なニューロン一本のニューラルネットワーク。ネットワークじゃないか。。

コード書く前に準備
以前使った超単純なニューロンがこれ。入力はxで教師がt。
f:id:myuteru:20170512000203p:plain
 ちなみに上の図はエクセルで描いてます。図形の挿入と数式オブジェクトを使って。マイクロソフトも認めているバグがあって、数式を書き直すとサイズがびよーんと伸びたりしてすごく使いづらい。パワポがあればな~。あ、昔オープンオフィスっていうのがあった気がする…ググったらあった!とりあえずダウンロード…重たい?てこずってる!?次回は使えてるかな。。

Pythonに不慣れで思うようにできない!
 エクセルVBAからPythonに移植したプログラムがこんな感じ。

import matplotlib.pyplot as plt
import xlrd
wb = xlrd.open_workbook('C:/Users/M/Desktop/ERNN.xlsx')
#ファイルパスをコピペ後に"\"に相当する部分を"/"に手動で変えないとダメ!
ws= wb.sheet_by_name('Sheet1')#ワークシートからデータの読み込み
dataX=[]
dataY=[]
for j in range(2,ws.nrows): #
    ox=ws.cell(j,0).value
    oy=ws.cell(j,1).value
    dataX.append(ox)
    dataY.append(oy)
w=100#重み
b=100#バイアス
p=0.001#数式中ではηと記述した。
for N in range(0,10000):#収束するまで繰り返し
    for i in range(0,ws.nrows-2):#ひとつずつ値xを入力
        y=w*dataX[i]-b
        u=y#活性化関数は今回なし
        t=dataY[i]#教師データ
        E=(u-t)*(u-t)/2#誤差の計算
        w=w-(p*dataX[i]*(u-t))#バックプロパゲーションによる更新
        b=b-(p*(t-u))#同上
yy=[]#最終的に決まったwとbで線を引く。
for i in range(0,ws.nrows-2):
    yy.append(w*dataX[i]-b)
plt.scatter(dataX,dataY,color="b")
plt.plot(dataX,yy,color="r")
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

結果はこんな感じ。青点が元データ。
f:id:myuteru:20170512000925p:plain 繰り返しN=100
f:id:myuteru:20170512001007p:plain 繰り返しN=1000 もう一声!
f:id:myuteru:20170512001041p:plain 繰り返しN=10000
はいここまで。収束計算ちゃんとできた気がする~。
 でも、誤差の出力もW,bといったパラメータの表示もできなかった。悔しい~。C#とかVBAならどうすればいいかすぐにイメージできるんだけど、Pythonにまだ頭がついていってない!早く慣れたい。。

今回は、ここまで!