LoginSignup
6
5

More than 5 years have passed since last update.

機械学習初心者が線形回帰やってみる

Posted at

はじめに

に続き、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)

参考

以下のサイト大変参考にさせていただきました

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5