はじめに
に続き、3回目になります。 今回は線形回帰をやってみたいと思います。
例によって、Pythonで実装, 詳しい説明は無理なので別のサイトでお願いします(笑
だんだん、雑になってきてる感ありますが生温かい目で見守ってください。
要点
用語的には以下の2つです。
- 平均二乗誤差
- 勾配法
平均二乗誤差
線形回帰の場合、分布されたデータに対して y = Θ_1x + Θ_2
の線を引きますが、その線を引いて実データとの誤差を取ることを平均二乗誤差と言います。
サンプルでは、以下のようにして定義しています。
T.dot()は内積の関数です。 それを切片の和から実データのyを引いて2乗したものを合計して学習データ数(m)で割ってます。
#費用関数
j = T.sum(T.sqr(t[0] + T.dot(data, t[1:]) - target)) / (2 * m)
図やらのイメージは
機械学習アルゴリズム実装シリーズ [線形回帰編] を参考にしてください!!
勾配法
勾配法は、y = Θ_1x + Θ_2
のΘ_1, Θ_2 をより正しいであろう方向に修正していくための方法です。
コード的には以下です。 t(= theta = Θ)という共有変数 (np.array([0,0])とする.)を微分するT.grad ()
をいうのを定義しています。 上記で定義した平均二乗誤差の関数を、それぞれΘ1, Θ2に関して偏微分をします。
その後、 train()
という関数を定義してupdates = ({})
で実行ごとにtの値を更新します。
# 偏微分
dt = T.grad(cost=j, wrt=t)
# 勾配法(Θの更新)
train = theano.function(
inputs = [],
outputs = [j],
updates = ({t: t - (alpha*dt)})
)
イメージは第4回 勾配法(最急降下法)を参考にしてください!!
サンプル (python)
コード見せろって人のために、コード貼っておきます。実装にはtheanoというライブラリを使っているのでわからない方はggってください!
予測あたりのコードはかけてません(時間あればコードアップデートします)
# -*- coding: utf-8 -*-
import numpy as np
import theano
import theano.tensor as T
class Regression:
def __init__(self):
self.t = None
def fit(self, data, target, alpha=0.1):
# 説明変数の長さを計算
if isinstance(data[0], (np.ndarray, np.generic)):
m = len(data[0])
else:
m = len(data)
# 共有変数
t = theano.shared(np.zeros(m+1), name='theta')
# 費用関数
j = T.sum(T.sqr(t[0] + T.dot(data, t[1:]) - target)) / (2 * m)
# 偏微分
dt = T.grad(cost=j, wrt=t)
# 勾配法(Θの更新)
train = theano.function(
inputs = [],
outputs = [j],
updates = ({t: t - (alpha*dt)})
)
# 学習
for i in range(100):
train()
if __name__ == '__main__':
from sklearn import datasets
iris = datasets.load_iris()
reg = Regression()
reg.fit(data=iris.data, target=iris.target)
参考
以下のサイト大変参考にさせていただきました