機械学習のための数学ゼミ第三回は行列編!
第一回の「確率分布編」、第二回の「ベイズの定理編」に続き、第三回は行列編です。
まずは本連載の登場人物をご紹介します!
<登場人物>
池澤あやか
タレントときどきエンジニア。数学は苦手だけど、機械学習入門したい。
増井雄一郎
株式会社トレタのえらいエンジニア。本人曰く、プログラムは書けるけど数学をまともに勉強したことがない。
梅崎先生
今回数学を教えてくれる先生。社会人のための数学教室「すうがくぶんか」の講師。
行列とは!?
「第1回目は二項分布と多項分布、第2回目はベイズの定理について学びました。今日は『行列』について学びます」
「行列…? 高校時代は文系だったので数学はⅡBまでやったのですが、確か私が学習した範囲では扱ってないような」
「行列って、つまり何者なんですか?」
「行列とは簡単に言ってしまえば1次方程式のことなんですよ。下のようなよく見る1次方程式は、行列でこう書き下せます」
●Before
●After
「メリットが分からん(笑)」
「こんな短い式だとメリットが分かりにくいですね。でもこんな長い式だとどうでしょうか?」
●Before
●After
「なんとなくスッキリ書けることは分かりました」
「行列は複雑な数学的概念をスッキリ書けるので重宝されているんですよ」
なぜ、機械学習に行列?
「なぜ、機械学習に行列が必要なんですか?」
「具体例で少し考えてみましょう。好きになった人の数をX1、付き合えた人の数をX2としてデータをマッピングするとします。下のような感じで」
「総じてリア充すぎませんか?」
「このデータをモテる人、モテない人に区分したいと思います。今は適当にこのあたりに区分線をいれますね」
「あまりに非情だ」
「この区分線、中学で習った1次方程式で書けますよね。池澤さん、どうなると思いますか?」
「おぼろげな記憶では、1次方程式のグラフは傾きと切片から求められたはずなので、こんな具合ですかね」
「正解です。この式は、移項するとこう変形することもできますね」
「また上の式をwを使って公式っぽく直すとこうです。上の式の例でいうと、
ですね」
「機械学習とはつまり、この適切なパラメーターw0、w1、w2を学習して、適切な区切り線を求めることなんですよ!」
「先程は、好きになった人の数をx1、付き合えた人の数をx2とした2次元のグラフでしたが、機械学習をする場合はもっと数多くの種類のデータを扱います。そうなると次元がどんどん増えてしまいますよね。そうなった場合も式上ではこんな感じで対応できるんです」
「これはプログラムでもfor文で記述できますね!」
sum = 0
for i in range(len(x)):
sum += w[i] * x[i]
「そうですね。数学界ではシグマを使って
と表現したりします。ちなみにこれを行列に直すとこう書けます」
「確かに複雑な区切り線なはずなのに行列では見やすく記述できますね!というか、区切り線じゃなくて、区切り面? ……3次元超えると面でもないような……?」
「混乱してますね(笑)。ちなみに、この区切りのことをみんな『超平面』って呼んでます」
実際の機械学習上は行列はどう使われているの?
「行列で超平面が表現できることは分かったのですが、実際の機械学習の中では超平面はどう使われているんですか?」
「また先程のグラフに戻って考えてみましょうか。このグラフでいうこの点やこの点は先程の方程式
に代入すると答えはどうなるでしょうか?」
「こんな感じか」
モテるに分類されている点(a)
モテないに分類されている点(b)
「つまり、右辺がマイナスの場合はモテる、プラスの場合はモテないということになりますね。ある人がどちらにマッピングされているかは、超平面の式に代入して右辺がプラスになるのかマイナスになるのかが分かれば分かるということになります」
「分類のしくみってそうなってたんだ…!」
「と、ここまでが前段です。ここからは、もっとデータ量が多い先ほどの超平面の行列を例に挙げて考えましょう」
「この超平面の式を使って、とある人のデータを表現するとこうなったとします」
「これが5人分になるとこうなります。この行列に対してちょうどいいωを求めるのが機械学習というわけです」
「改めて、5人分とかそれ以上の人数分のデータを、ひとつの式で管理できる行列ってすごいですね」
「機械学習のモデルって、決定木とかパーセプトロンとかSVMとかたくさんあると思うんですけど、これはなんですか?」
「あれは簡単に言うと、どういう風にwを求めるかのアルゴリズムがたくさんあるってことなんですよ」
「行列と機械学習の関係がすごい分かりました。今ものすごくへぇ〜ボタン連打したい気分です」
行列の計算をプログラムで書いてみよう
「行列の計算は行と列が多くなればなるほど手で計算するのが大変になります。例えば下の式を手で解いてみてください」
「うわあ(イヤな予感)」
「ムリです、長すぎです…」
「行列は大きくなればなるほど、手で解くとめっちゃ大変なんですね。ここで活躍するのがプログラムです。先程の行列はプログラムではこう書けますね。プログラムで書くと、実行もあっという間です」
import numpy as np
m1 = np.matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
m2 = np.matrix([[1, 3, 5, 7], [2, 4, 6, 8], [9, 10, 13, 15], [10, 12, 14, 16]])
print m1.dot(m2)
>>
[[ 72 89 112 132]
[160 205 264 316]
[248 321 416 500]
[336 437 568 684]]
「うわあ、早い&スッキリ!プログラムってすごい!!!」
「Pythonには『Numpy』という便利な計算用ライブラリがあるので、こんなに簡単に記述できるんですよ。Pythonはこういった機械学習系のライブラリが充実しているので、『機械学習をするときはPythonで!』という風潮が生まれたんですよ」
次回は今回たくさん出てきたwの推定、つまりパラメーターの推定について学びます。そして、そこで必要な数学として微分について復習します。
次回もどうぞお楽しみに!
CodeIQで機械学習クイズに挑戦しよう!
機械学習の理解度をはかるクイズに挑戦してみませんか?
ITエンジニアのスキルの腕試しができる「CodeIQ」では初心者向けの基礎知識をチェックできるクイズを出題中!
ぜひチャレンジしてみてくださいね♪
↓

















