2016年12月9日 更新

「パターン認識と機械学習」理解のための数学〜pythonで最小二乗法を解く(改良版)part1〜

今回は昨今話題になっている機械学習を理解する上で必要となる数学についてご紹介します。

605 view お気に入り 0

先日,インターンのみんなで「パターン認識と機械学習(上)」の第1章の輪読会を行いました.

 (1790)

輪読会の中で主に議論となったのは,多項式フィッティング. 多項式フィッティングとは,たくさんあるデータ点を多項式で表現する,というものです. 例えば,下の図を見てください. 散布図に当てはまりの良い直線 $y=ax+b$ を引いています.

データ点が散布している

データ点が散布している

 (1793)

上の例では直線,つまり一次関数を考えていますが, 「多項式」と言うわけですから,一般には何次の関数でも同じことができます. $N$ 次の関数を仮定すれば, \begin{align} y=w_0+w_1x+\cdots +w_Nx^N \end{align} という形で書くことができます.この形に統一するなら,先ほどの直線 $y=ax+b$ は \begin{align} y=w_0+w_1x \end{align} に相当します.ここまではOKですよね! 直線の例は,結局1次多項式の例を考えていたにすぎない,というわけです.

では,データ点にちょうどうまくフィットするようなパラメータ $a,b$ は どうやったら見つけられるのでしょうか?

ここで係数を求める方法が, 最小二乗法と呼ばれる方法です. 最小二乗法とは

データとの差を縦に見て,差分の二乗の和が最も小さくなるように係数を決める

というものです.下図を見てイメージをつかんでください. 点線部分が「差分」に相当します. この差分 $d$ の二乗を全てのデータ点について計算して足しあわせ, それが最も小さくなるように係数を設定するとよい.これが最小二乗法です.

 (1797)

一般に,$M$ 点からなるデータがそれぞれ $(x_i,y_i)$ と表されており, これを $N$ 次の多項式でフィッティングすることを考える場合,差分 $d$ は \begin{align} d&=y_i-(w_0+w_1{x_i}+\cdots+w_N{x_i}^N)\notag\\ &=y_i-\sum_{k=0}^Nw_k{x_i}^k \end{align} と表されますから,全ての差分の2乗の総和は \begin{align} S(w_0,\ldots,w_N)=\dfrac{1}{2}\sum_{i=1}^M\left(y_i-\sum_{k=0}^Nw_k{x_i}^k\right)^2 \end{align} となります.$\dfrac{1}{2}$ というのは,後々の都合を考えて便宜上つけたものです.

これを最小にすれば,求めたい多項式の係数 $w_k$ が得られる,ということがわかりますね! しかし,ここからが問題です. どうやってこの $S(w_0,\ldots,w_N)$ を最小にするものを求めるのでしょうか.

当てずっぽう,では到底無理ですよね. なぜなら,決定するべきパラメータがたくさんあるからです.

もしもパラメータが1つしかなかったら,最小値を求めるのは比較的簡単です. 例えば, \begin{align} f(w)=w^2+4w+1 \end{align} の値を最小にするものを求めたいとき,どのようにするでしょうか.

こういうときに強力な力を発揮するツールが微分です. 微分とは,大雑把に言えば傾きのこと. 二次関数ならその関数の傾きが0になるところが最小値となるだろう,と予測できるわけです.

上の関数を微分してみると \begin{align} f'(w)=2w+4 \end{align} となり,この値が0になるのは $w=-2$ のときだから, $f(w)$ は $w=-2$ の時に最小になる,と瞬時に求まるわけです.

実は,この微分するという方針,これはパラメータが沢山あっても使えます. では今回の最小二乗法の場合,何を微分すればよいのでしょうか. 決定したい変数は,多項式フィッティングの係数 $w_0,\ldots,w_N$ です. 先程,一変数の場合は「パラメータ$w$」で微分することで 目的のパラメータの値が分かるのでした. その類推で,今回も $w_0$ から $w_N$ までで微分すればよいのか,と想像ができます. そうなんです.しかし,$N+1$ 個も微分するのは確実に大変ですね.

ここで導入するのが,「ベクトルで微分を行う」という方法です. が,今回は長くなったのでひとまず休憩し, 次の章からベクトルでの微分について考えていきます.

9 件

関連する記事 こんな記事も人気です♪

KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)

KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)

まだ機械学習の勉強を初めて4ヶ月ですが、色々やってみた結果、約7000人のうち200位ぐらいの0.82297という記録を出せたので、色々振り返りながら書いていきます。
Takumi Ihara | 2,894 view
Kaggleで使われている略語リスト

Kaggleで使われている略語リスト

機械学習のサイトKaggle で使われている略語をまとめました. 画像は[https://static1.squarespace.com/static/58a3826fd2b857e5fe09f025/58ac6a226b8f5b3bdce84c5a/58d04a9246c3c4a6bd5ab664/1490045642866/Kaggle+Workshop.png?format=1500w]から引用
Takumi Ihara | 41 view
5秒でOpenCVのインストールする (Windows, Mac, Linux)

5秒でOpenCVのインストールする (Windows, Mac, Linux)

pipでOpenCVが利用可能になり、今までの面倒な処理が一切不要になりました。
北村 旭 | 265 view
KaggleチュートリアルTitanicで上位1%に入った話。(0.87081)

KaggleチュートリアルTitanicで上位1%に入った話。(0.87081)

前回書いた「KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)」 から久々にやり直した結果上位1%の0.87081を出せたのでどのようにしたのかを書いていきます。
Takumi Ihara | 456 view
Deep learningで画像認識⑩〜Kerasで畳み込みニューラルネットワーク vol.6〜

Deep learningで画像認識⑩〜Kerasで畳み込みニューラルネットワーク vol.6〜

U-Netと呼ばれるU字型の畳み込みニューラルネットワークを用いて、MRI画像から肝臓の領域抽出を行ってみます。
木田智士 | 1,925 view

この記事のキーワード

この記事のキュレーター

三好 裕之 三好 裕之