2016年12月9日 更新

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

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

2,543 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 | 185,834 view
量子アニーリングを駆使して数独を解いてみた

量子アニーリングを駆使して数独を解いてみた

先日,量子アニーリングの勉強会に参加して来ました.そのアウトプットとして,今回,数独ソルバーを作ってみます.
井上 大輝 | 4,058 view
Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

Morphology (モルフォロジー) 変換の実装 ~ Python + OpenCV ~

画像処理の一つ,モルフォロジー変換をPython と OpenCVのライブラリを用いて実装し,それを2値画像に対して適用します.
Medical Imaging Tech Night開催のお知らせ

Medical Imaging Tech Night開催のお知らせ

2018年11月25日(日)~11月30日(金)まで米国シカゴにて開催される「RSNA2018(第104回北米放射線学会)(※1)」の「Machine Learning Showcase」にて出展いたします。そこで得た最新の情報を元に、医用画像解析・機械学習に関するプレゼンテーションおよびトークセッションと交流会を実施いたします。
等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

前回の記事「等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 1」の続きです. 実際に実装をして,写像を確かめてみます.

この記事のキーワード

この記事のキュレーター

エルピクセル編集部 エルピクセル編集部