TechFULの中の人

TechFULスタッフ・エンジニアによる技術ブログ。IT関連のことやTechFULコーディングバトルの超難問の深掘り・解説などを紹介

行列の掛け算だけでデータ分析

こんにちは.TechFULでアルバイトをしているzekiです. TechFUL PROで機械学習に関する問題を作成しています. 機械学習と行列計算は切っても切れない関係にありますが,今回はこの行列計算の掛け算のみを使ってデータを分析していきます.

行列というのは数字を長方形上に並べたものです. 例えば次のようなもので

$$ \begin{pmatrix} 1 & 2 & 300 & 4 \\ -1 & -3 & 0 & 4 \\ 10 & 100 & 1000 & 2 \end{pmatrix} $$ これは3行4列の行列と言えます. 行列計算はこのような行列どうしの計算を行うものです. 数学的には行列は様々な特性や用途を持ちますが,機械学習ではほとんどの場合「大量のベクトルを一度に計算する」ために用いられます. 例えば次のようなデータがあります.

名前 国語 数学 理科 社会 英語
A 70 80 77 68 90
B 44 98 100 20 28
C 75 60 39 68 88
D 50 50 50 50 50
E 99 78 80 93 92
F 90 34 47 91 84
G 100 100 100 100 100

これはあるテストにおける7人の5科目の点数です. Gが最も優秀に見えますね. では7人の優秀さランキングはどうなるのでしょう. ...それは優秀さの定義によると言えますよね. 我々が見たいのは「優秀さ」であって5科目の点数ではありません. とは言えわかるのは5科目の点数だけですから,そこから「優秀さ」を計算する必要があります. こんな時,行列計算が役に立ちます. 今回使うのは「掛け算」です. 行列の掛け算は次のように計算されます.

$$ \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \end{pmatrix} \begin{pmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \\ b_{31} & b_{32} \\ b_{41} & b_{42} \end{pmatrix} \\ = \begin{pmatrix} a_{11}b_{11} + a_{12}b_{21} + a_{13}b_{31} + a_{14}b_{41} & a_{11}b_{12} + a_{12}b_{22} + a_{13}b_{32} + a_{14}b_{42} \\ a_{21}b_{11} + a_{22}b_{21} + a_{23}b_{31} + a_{24}b_{41} & a_{21}b_{12} + a_{22}b_{22} + a_{23}b_{32} + a_{24}b_{42} \\ a_{31}b_{11} + a_{32}b_{21} + a_{33}b_{31} + a_{34}b_{41} & a_{31}b_{12} + a_{32}b_{22} + a_{33}b_{32} + a_{34}b_{42} \end{pmatrix} $$ なかなか理解しがたいかもしれないですが,$b$の方の行列を1列だけにすると $$ \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \end{pmatrix} \begin{pmatrix} b_{11} \\ b_{21} \\ b_{31} \\ b_{41} \end{pmatrix} \\ = \begin{pmatrix} a_{11}b_{11} + a_{12}b_{21} + a_{13}b_{31} + a_{14}b_{41} \\ a_{21}b_{11} + a_{22}b_{21} + a_{23}b_{31} + a_{24}b_{41} \\ a_{31}b_{11} + a_{32}b_{21} + a_{33}b_{31} + a_{34}b_{41} \end{pmatrix} $$ となります. テストの点数に対してこれを行ってみましょう. まず,点数の表を行列Xとして表すと以下のようになります. $$ X = \begin{pmatrix} 70& 80& 77& 68& 90 \\ 44& 98& 100& 20& 28 \\ 75& 60& 39& 68& 88 \\ 50& 50& 50& 50& 50 \\ 99& 78& 80& 93& 92 \\ 90& 34& 47& 91& 84 \\ 100& 100& 100& 100& 100 \end{pmatrix} $$ 単に表と同じように並べただけですので,1行目がA, 2行目がB,...という風になっています. で,これに5行1列の行列を掛け算するとこうなります. $$ X \begin{pmatrix} w_1 \\ w_2 \\ w_3 \\ w_4 \\ w_5 \end{pmatrix} = \begin{pmatrix} 70w_1+ 80w_2+ 77w_3+ 68w_4+ 90w_5 \\ 44w_1+ 98w_2+ 100w_3+ 20w_4+ 28w_5 \\ 75w_1+ 60w_2+ 39w_3+ 68w_4+ 88w_5 \\ 50w_1+ 50w_2+ 50w_3+ 50w_4+ 50w_5 \\ 99w_1+ 78w_2+ 80w_3+ 93w_4+ 92w_5 \\ 90w_1+ 34w_2+ 47w_3+ 91w_4+ 84w_5 \\ 100w_1+ 100w_2+ 100w_3+ 100w_4+ 100w_5 \end{pmatrix} $$ 仮に $w_1=w_2=w_3=w_4=w_5=1$ としてみるとそれぞれの行は単にそれぞれの合計点を表していることがわかります. $$ X \begin{pmatrix} 1 \\ 1 \\ 1 \\ 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 70+ 80+ 77+ 68+ 90 \\ 44+ 98+ 100+ 20+ 28 \\ 75+ 60+ 39+ 68+ 88 \\ 50+ 50+ 50+ 50+ 50 \\ 99+ 78+ 80+ 93+ 92 \\ 90+ 34+ 47+ 91+ 84 \\ 100+ 100+ 100+ 100+ 100 \end{pmatrix} $$ 合計点でランキングなどが作られることも多いですからよくある優秀さの定義と言えるでしょう. また,$w_1=w_5=1, w_2=w_3=w_4=0$ としてみると, $$ X \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \\ 1 \end{pmatrix} = \begin{pmatrix} 70+ 90 \\ 44+ 28 \\ 75+ 88 \\ 50+ 50 \\ 99+ 92 \\ 90+ 84 \\ 100+ 100 \end{pmatrix} $$ となります. 今度は国語と英語の合計です. 語学の優秀さという意味ではこういった優秀さも考えられるでしょう. このように $w_1,w_2,w_3,w_4,w_5$ の値を変化させることで優秀さの定義を変化させることができます. 具体的にはそれぞれの$w$はそれぞれの科目の「重み」を表現していると言えます. つまりは $w_1,w_2,w_3,w_4,w_5$ こそが優秀さの定義になっているというわけです. そしてこの計算は人数が増えてもデータの行数が増えるだけなので同じように行うことができます. これが大量のデータを扱う機械学習においてとても便利なのです.

「優秀さ」というのはその人の一つの側面でしかありません. テストの結果から見えるその人の個性はまだ存在するはずなのです. 例えば「理系っぽさ」はどうでしょう. 理系なら数学と理科の点数が高そうですからそれらの平均点として$w$は$w_2=w_3=0.5, w_1=w_4=w_5=0$としてみましょう. $$ X \begin{pmatrix} 0 \\ 0.5 \\ 0.5 \\ 0 \\ 0 \end{pmatrix} = \begin{pmatrix} 80\times 0.5+ 77\times 0.5 \\ 98\times 0.5+ 100\times 0.5 \\ 60\times 0.5+ 39\times 0.5 \\ 50\times 0.5+ 50\times 0.5 \\ 78\times 0.5+ 80\times 0.5 \\ 34\times 0.5+ 47\times 0.5 \\ 100\times 0.5+ 100\times 0.5 \end{pmatrix} = \begin{pmatrix} 78.5 \\ 99 \\ 49.5 \\ 50 \\ 79 \\ 40.5 \\ 100 \end{pmatrix} $$ これで並べ替えるとこうなります.

名前 理系っぽさ 国語 数学 理科 社会 英語
G 100 100 100 100 100 100
B 99 44 98 100 20 28
E 79 99 78 80 93 92
A 78.5 70 80 77 68 90
D 50 50 50 50 50 50
C 49.5 75 60 39 68 88
F 40.5 90 34 47 91 84

Gが1位になりましたがこれは理系と言えるのか怪しいところです. 試しに文系っぽさも国語,社会,英語の平均点として同様に計算してみましょう. $w$は$w_1=w_4=w_5=\frac{1}{3}, w_2=w_3=0$として, $$ X \begin{pmatrix} \frac{1}{3} \\ 0 \\ 0 \\ \frac{1}{3} \\ \frac{1}{3} \end{pmatrix} = \begin{pmatrix} 70\times \frac{1}{3}+ 68\times \frac{1}{3}+ 90\times \frac{1}{3} \\ 44\times \frac{1}{3}+ 20\times \frac{1}{3}+ 28\times \frac{1}{3} \\ 75\times \frac{1}{3}+ 68\times \frac{1}{3}+ 88\times \frac{1}{3} \\ 50\times \frac{1}{3}+ 50\times \frac{1}{3}+ 50\times \frac{1}{3} \\ 99\times \frac{1}{3}+ 93\times \frac{1}{3}+ 92\times \frac{1}{3} \\ 90\times \frac{1}{3}+ 91\times \frac{1}{3}+ 84\times \frac{1}{3} \\ 100\times \frac{1}{3}+ 100\times \frac{1}{3}+ 100\times \frac{1}{3}\end{pmatrix} = \begin{pmatrix} 76 \\ 30.67 \\ 77 \\ 50 \\ 94.67 \\ 88.33 \\ 100 \end{pmatrix} $$ となります. それぞれの理系っぽさと文系っぽさを並べるとこうなります.

名前 理系っぽさ 文系っぽさ 国語 数学 理科 社会 英語
A 78.5 76 70 80 77 68 90
B 99 30.67 44 98 100 20 28
C 49.5 77 75 60 39 68 88
D 50 50 50 50 50 50 50
E 79 94.67 99 78 80 93 92
F 40.5 88.33 90 34 47 91 84
G 100 100 100 100 100 100 100

なんだか,差を取ると理系かどうかわかりそうですね. この差を「改良版理系っぽさ」として計算してみましょう. せっかくなのでこれも行列計算で出してみると, $$ \begin{pmatrix} 78.5 &76 \\ 99 &30.67 \\ 49.5 &77 \\ 50 &50 \\ 79 &94.67 \\ 40.5 &88.33 \\ 100 &100 \end{pmatrix} \begin{pmatrix} 1 \\ -1 \end{pmatrix} = \begin{pmatrix} 78.5 -76 \\ 99 -30.67 \\ 49.5 -77 \\ 50 -50 \\ 79 -94.67 \\ 40.5 -88.33 \\ 100 -100 \end{pmatrix} = \begin{pmatrix} 2.5 \\ 68.33 \\ -27.5 \\ 0 \\ -15.67 \\ -47.83 \\ 0 \end{pmatrix} $$ これで並べ替えるとこうなります.

名前 改良版理系っぽさ 国語 数学 理科 社会 英語
B 68.33 44 98 100 20 28
A 2.5 70 80 77 68 90
G 0 100 100 100 100 100
D 0 50 50 50 50 50
E -15.67 99 78 80 93 92
C -27.5 75 60 39 68 88
F -47.83 90 34 47 91 84

いかにも理系な感じのBが1位になりました. 上に行くほど理系っぽい点数で,下に行くほど文系っぽい点数になっていますね. 今,「データ⇒[理系っぽさ,文系っぽさ]⇒改善版理系っぽさ」というような流れで計算をしましたが,これらは一本の式で表すことができます. $$ X \begin{pmatrix} 0 & \frac{1}{3} \\ \frac{1}{2} & 0 \\ \frac{1}{2} & 0 \\ 0 & \frac{1}{3} \\ 0 & \frac{1}{3} \end{pmatrix}\begin{pmatrix} 1 \\ -1 \end{pmatrix} = \begin{pmatrix} 78.5 &76 \\ 99 &30.67 \\ 49.5 &77 \\ 50 &50 \\ 79 &94.67 \\ 40.5 &88.33 \\ 100 &100 \end{pmatrix} \begin{pmatrix} 1 \\ -1 \end{pmatrix} = \begin{pmatrix} 2.5 \\ 68.33 \\ -27.5 \\ 0 \\ -15.67 \\ -47.83 \\ 0 \end{pmatrix} $$ 先ほど優秀さを求めるときには飛ばしましたが,データ行列に複数列の行列を掛けることは「複数の特徴を同時に算出する」ことに相当します. ここではそれを利用して理系っぽさと文系っぽさという2つの特徴を同時に算出しています. また,後半の掛け算を先に計算することで優秀さの時のように改良版理系っぽさを一つの行列によって定義できます. $$ X \begin{pmatrix} 0 & \frac{1}{3} \\ \frac{1}{2} & 0 \\ \frac{1}{2} & 0 \\ 0 & \frac{1}{3} \\ 0 & \frac{1}{3} \end{pmatrix}\begin{pmatrix} 1 \\ -1 \end{pmatrix} = X \begin{pmatrix} -\frac{1}{3} \\ \frac{1}{2} \\ \frac{1}{2} \\ -\frac{1}{3} \\ -\frac{1}{3} \end{pmatrix} $$ 行列の良さは,こういった,行列を複数回かけるといった手順を1回の計算にまとめられるというところにもあるといえるでしょう. データや特徴が大量になればなるほど計算を短縮できます.

さて,改良版理系っぽさが正しい理系っぽさなのだとしたら少し引っかかる点があります. それぞれの科目の難易度は平等なんでしょうか? 例えば,平均点の低い数学のテストとほぼ全員が満点を取れるような理科のテストがあったとしたら,同じ式でいいんでしょうか? 実際にはそれぞれのテストの1点の価値は違いますし,もっと細かく見れば,80点までは取りやすいけどそれ以上取るのが難しいテストだってあるかもしれません. 今回計算した行列による定義はざっくりとした特徴を導き出します. しかしながら,より良い定義を作ることは可能です. 機械学習とはある意味,この「より良い定義」を算出する手法です. TechFUL PROでは機械学習に関する問題を提供しています. 基礎的な問題も説明付きで提供していますので,ぜひ挑戦してみてください!