The sky is the limit

ハイブリッドアプリ開発、PWAなど効率の良いiOSアプリ、Androidアプリ開発の情報を共有したい。アプリ開発は楽しい。【PWA、AngularJS、Monaca、Cordova、OnsenUI】

【人工知能のつくりかた】機械学習を実装するときのNumpyの役割・仕事は?【Numpy/機械学習】

【人工知能のつくりかた】機械学習を実装するときのNumpyの役割・仕事は?【Numpy/機械学習】

前々回、Numpyの基本を勉強した。
www.sky-limit-future.com

よく機械学習にはNumpyが必要とか聞くけど、Numpyだけを学んでいてもそれはわからない。
なので、今回は機械学習でやりたいこととNumpyがどうリンクしてくるのか軽く調べた。

重みとバイアス

機械学習では
「とある入力に対して、それらしい出力を返す。」
という日本語を以下のような式に書き換える

出力 = 重み × 入力 + バイアス

ここが基本。

重みと入力

■app.py

import numpy as np
import matplotlib.pyplot as plt

# create numpay array
x = np.arange(0,10,1)
y = 10*x + 2

plt.plot(x,y,marker='o')
plt.show()

上記を動かすとこんな感じ。

f:id:duo-taro100:20171006005330p:plain

app.pyの中にある

y = 10*x + 2

と先ほどの式を比較すると、

出力 : y
重み : 10
入力 : x
バイアス : 2

となる。

入力とNumpy

何が言いたいかというと、中学校で習った一次関数であればnumpyを使う必要はないということ。
numpyの特徴はテンソル(n次元配列)だし、上記のような x = 1 とか入力がとある一つの値であればnumpyを使う必要がない。

機械学習の場合、入力は配列

例外はあると思うけど、基本は配列の入力があって、それに対して出力するというものになる。
具体例として株価予測をする機械学習を挙げる。
(例なので実際の株価予測には使えない)

株価には
・始値
・終値
・高値
・安値
という指標がある。
この4つの指標が昨日よりも上がった場合を1,下がった場合を0とする。
最初は4つの指標のうち、どれが重要なのかわからないのでそれぞれの重みは同じで、今回は1とする。
バイアスはとりあえず0で。

さっきの

出力 = 重み × 入力 + バイアス

に当てはめて見ると

株価は上がるかどうか
= (始値×1 + 終値×1 + 高値×1 + 安値×1) + 0
= 始値 + 終値 + 高値 + 安値

つまり、入力と重みが複数あるということ。
これがnumpyを使う意味。
numpyは配列2つで計算すると、各要素同士の計算となる。

入力x = [始値, 終値, 高値 ,安値] = [1, 1, 0, 1 ]
重みw = [始値の重み, 終値の重み, 高値の重み ,安値の重み] = [1,1,1,1]
バイアスb = 0

とした時に、出力yは

import numpy as np

x = np.array([1,1,0,1])
w = np.array([1,1,1,1])
b = 0

y = np.sum(x*w) + b

print(y)

実行結果は

3

ここではデータに1と0しかないから、分かりにくいけど各要素の掛け算をしてくれているのがわかる。
numpyだと簡単。
結果の「3」が表しているものは何なのかは実際に試して見ないとわからない。
この値が大きいと株価が上がるのか、それとも下がるのか。

【補足】
実際には「閾値」を設定して、上記の「3」の場合に、株価が上がるのか、それとも下がるのかを決定する。
例えば、閾値が2.0だったとする。値が2.0以下の場合、株価が上がる( = 1)とすれば
上記の結果は3 > 2.0なので株価が下がる(=0)と判断される。

入力に対して重みが異なる

本来は上記の式で検証を重ねた結果から、もしくは実装者の思いや考えによって、4つの指標に対する重みは変わってくる。
終値は重要、始値は普通、高値と安値はあまりあてにならないという時には

入力x = [始値, 終値, 高値 ,安値] = [1, 1, 0, 1 ]
重みw = [始値の重み, 終値の重み, 高値の重み ,安値の重み] = [0.5, 1, 0.1, 0.1]
バイアスb = 0

pythonにすると

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1,1,0,1])
w = np.array([0.5,1,0.1,0.1])
b = 0

y = np.sum(x*w) + b

print(y)

実行結果は

1.6

この「1.6」も先ほどの結果同様に、表しているものは何なのかは実際に試して見ないとわからない。

【補足】
先ほど同様、閾値が2.0だったとする。値が2.0以下の場合、株価が上がる( = 1)とすれば
上記の結果は1.6 <= 2.0なので株価が上がる(=1)と判断される。

numpyは機械学習の計算に向いてる

こういう計算をするのにnumpyは便利ということ。


とりあえず、今回調べたこと。
最後に、もう一度。上記の内容は例であって、同じ実装をしても株価予測は上手くいかない。
当記事は、随時更新します。