「統計学が最強の学問である(数学編)」で機械学習の入り口に連れて行ってもらおう

in  Python, 統計学

「統計学が最強の学問である(数学編)」を読み終わりました。機械学習を学ぶための数学の知識を叩き込んで、機械学習の入り口まで連れて行くぞという著者の意志を強く感じる本でした。

記号論理学から始まって、連立方程式、線形代数、微分積分まで、幅広い知識の中から機械学習に必要なエッセンスを詰め込みながら、機械学習・ディープラーニングの入り口まで連れて行ってくれる一冊になっています。

内容

この本の流れを簡単にまとめると下記のようになります。

  1. 簡単な確率、記号論理学、集合から最終的には迷惑メールフィルタでも用いられていたナイーブベイズ
  2. 1次、2次の関数を学び、ちょうど良い数を求めるための平方完成
  3. 二項定理から二項分布、対数、ネイピア数について
  4. たくさんの数を効率的に表記するためにΣ、ベクトル、行列
  5. ちょうど良いところを探すための微分、確率密度関数を理解するための積分
  6. 線形代数と微積分を同時に使うことで機械学習、ディープラーニングの入り口へ!

やはりクライマックスはこれまでの知識を積み上げて機械学習の入り口が見えてくる6章です。特に行列、偏微分のありがたみがわかった最小二乗法の解法はしびれました。

行列、偏微分を用いた最小二乗法とnumpy

2章では訪問回数と契約件数のデータを元に比例関係の式を最小二乗法で2章で学んだ最小二乗法は平方完成により答えをめました。 6章ではこれまで学んできた知識、つまり微分、行列を使った解法を解説してくれています。

下記が2章の例示されていたデータになります。

訪問回数(単位:100回) 契約件数(単位:1件)
1 10
2 40
3 82

上記の表で表されるモデルが訪問回数をx, 契約件数をyとした場合に直線で表されるとします。 この場合にモデルを表す式は下記のようになります。

\[ y = a + bx + \varepsilon \]

εが誤差でこの誤差を最小にするa, bを求めます。 データは3つありますので、それぞれx, yに代入すると3つの式が出てくるわけですが、これを行列で表現すると3つの式ではなく一つの行列式で表すことができます。

\[ y = X\beta + \varepsilon \]

X, y, β,εはそれぞれ下記のような行列になります。

\[X = \begin{pmatrix} 1 & x_1 \ 1 & x_2 \ . & . \ . & . \ 1 & x_n \end{pmatrix} , y = \begin{pmatrix} y_1 \ y_2 \ . \ . \ y_n \end{pmatrix} , \beta = \begin{pmatrix} a \ b \end{pmatrix} , \varepsilon = \begin{pmatrix} \varepsilon_1 \ \varepsilon_2 \ . \ . \ \varepsilon_n \end{pmatrix} \]

εの二乗和が最小になるようなa, とbを求めるのが最小二乗法です。 行列の場合、誤差の二乗の和を求める方法としてはεの転置行列とεの内積で表現することができます。

\[ \varepsilon^{ \mathrm { T } }\varepsilon \]

この二乗和が最小になる時のa,bを求めるためにβで偏微分してやります。

\[ \frac{ \partial \varepsilon^{ \mathrm { T } }\varepsilon } { \partial \beta } \]

ここからは、この章にたどり着くまでに得た行列や偏微分の知識を駆使して進めて行くのですが、 詳しい解法は是非本書で確認してみてください。結果として下記の式が得られます。

\[ \beta = (X^{ \mathrm { T } }X)^{-1}X^{ \mathrm { T } }y \]

\[ (X^{ \mathrm { T } }X)\beta = X^{ \mathrm { T } }y \]

この式に今回の例を代入すると、下記のようになります。

\[ \begin{pmatrix} 1 & 1 \ 1 & 2 \ 1 & 3 \end{pmatrix}^{ \mathrm { T } } \begin{pmatrix} 1 & 1 \ 1 & 2 \ 1 & 3 \end{pmatrix} \begin{pmatrix} a \ b \end{pmatrix} = \begin{pmatrix} 1 & 1 & 1 \ 1 & 2 & 3 \end{pmatrix} \begin{pmatrix} 10 \ 40 \ 82 \end{pmatrix} \]

ここまでくるとPythonで機械学習をやる上で定番のnumpyを使い、逆行列を用いて傾きと切片を求めることができます。 この本で学んだ数学の知識が、自分がこれまで学んできた機械学習の定番、numpyと出会った瞬間でした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy

x = numpy.array([[1, 1], [1, 2], [1, 3]])
y = numpy.array([10, 40, 82])

left = numpy.dot(x.T , x)
right = numpy.dot(x.T,  y)
inv_left = numpy.linalg.inv(left)
beta = numpy.dot(inv_left, right)
print(beta)

結果は下記のようになります。

1
[-28.  36.]

データ(今回の場合x, y)が増えていっても、この式に当てはめれば容易に最小二乗法を用いたモデルを導くことができます。

まとめ

自分自身はこの本を読む前に機械学習の本を読み始めてしまっていましたが、これから学習する方には是非ともお勧めしたい一冊です。 この本で得た知識を携えて、なんとなく通り過ぎているこれまでの知識をもう一度ブラッシュアップしたいと思います。


Share