🐥

哲学と理論で学ぶ機械学習_主成分分析(PCA)

2024/07/17に公開

前書き

高校時代の文理選択では理系を選択しましたが、哲学と歴史が好きなAIエンジニアです。

人の哲学はその人の大事にしている価値観や考え方が表れていると思います。色んな考え方に触れ、その中から自分の価値観を磨き上げていく感覚は面白いと感じます。

歴史もその時代を生きた人達の価値観が合わさった結果だと捉えているので哲学の面白さと被るものがあると思います。そして何より過去、現在の出来事から未来を考えていく感覚はやはり面白いと思います。

愚者は経験に学び、賢者は歴史に学ぶ
その昔ドイツを統一に導いた政治家がこんな言葉を残したらしいです。格好良いですね(^^)


『哲学と歴史、機械学習と関係なくない?』
と感じる方もいるかもしれません。

そんなことはありません。

個人的に機械学習は哲学を数学で落とし込んだ学問だと捉えています。
なので、結構近いと思います。
落とし込んでいく過程も見ていくと色々面白いものです。

過去のデータから未来を予測するという点では歴史とも被ります。

まさに面白い学問の詰め合わせみたいな感じです(^^)
その辺がハマる人にはハマるのだと思います。


今回は様々なものに応用される"主成分分析(Principal component analysis: PCA)"という手法について哲学と理論をまとめていきたいと思います。

さあ・・・読めよ
きっと・・・面しれぇことが分かる

必要な事前知識

固有ベクトル・固有値、固有値分解

主成分分析の理論を理解するのにかかせない知識として、固有ベクトル・固有値、固有値分解があります。

固有ベクトルは行列に掛けても定数倍されるだけ(大きさが変わるだけ)で向きが変わらない特殊なベクトルのことでした。この時、変化する大きさのことを固有値と言いました。
一般的なベクトルの場合、行列と掛け合わせるとベクトルの向きも大きさも変わるんでしたね。

行列\mathbf{A}の固有ベクトルを\mathbf{v}, 固有値を\lambdaとすると以下のような式で表せました。

\mathbf{A}\mathbf{v} = \lambda\mathbf{v}

固有ベクトルと固有値は特殊なもので、全ての行列が持つわけではないという点も大事なポイントでした。

行列が固有ベクトル・固有値をもつ場合、
・固有ベクトルをまとめた行列\mathbf{V}
・対角成分に固有値をまとめた行列\Lambda
・固有ベクトルをまとめた行列の逆行列\mathbf{V^{-1}}
の積の形に変形することを固有値分解と言いました。

数式にすると以下の形です。

\mathbf{A} = \mathbf{V} \Lambda \mathbf{V^{-1}}

詳細が気になる方は以下の記事もご覧ください。
https://zenn.dev/goals_techblog/articles/1c1eded6626c61

ラグランジュの未定乗数法(Lagrange multipliers)

制約付き最適化問題を解く手法としてラグランジュの未定乗数法という手法が存在します。

イコール0が成り立つ式を制約として、

\begin{aligned} L &= \{最適化したい式\} - \lambda \{イコール0が成り立つ式\} \\ \end{aligned}

という感じの関数(ラグランジュ関数)を作成します。

このラグランジュ関数L極値を持つ場合、最適化したい式それぞれの変数と\lambdaで偏微分してイコール0で解いたものの解として求まるというものです。

後で出てきますが、今は1つの手法としてこんなものがあるのねという感じでスルーしてもらって大丈夫です。

主成分分析の哲学

要点を絞ることの良さ

さてここからやっと本題に入ります。

まず情報の量、正確性(正しさ・厳密さ)、分かりやすさの関係について考えていきます。

一般的に正しさ・厳密さを意識すると細かい部分まで説明が必要になるので情報量は増えていきます。
専門家同士の会話では何も問題ない気がします。
しかし専門外の人に説明する時は正しさ・厳密さよりも分かりやすさを意識した方が良かったりします。
正しさよりも分かりやすさが欲しい人は多いと思います。
正しさよりも優しさが欲しいという感覚とも似ています(^^)

この辺も一種の哲学ですが、正しさ・厳密さを追求することが必ずしも良いこととは限らないのだと思います。

何はともあれ、要点を絞ることの良さは様々なところで言われていると思います。

・1スライド1メッセージ
・要点は多くても3つまでに絞りましょう
こんな感じのものはよく聞く話だと思います。

データの分析も同じです。
大量のデータを1つ1つ見ていくのはとても大変です。
重要な部分特徴的な部分)を残して上手くまとめることができると、理解しやすいし、データの容量も減らすことができるし、計算コストも少なくなります。
重要な部分を残すことができると嬉しいんです。

特徴って何だろう?

問題はどうやって重要な部分特徴的な部分を見つけるのか? です。

人間であれば、主観的にここが重要です! とまとめることができます。
なんとなくでも要点をまとめることができます。
ちなみに人間の種はサピエンスというらしいです。
サピエンスは"賢い, 知恵のある"という意味らしいです。
賢くて知恵のある我々は主観で特徴的な部分を見つけ、うまくまとめることができるのです。
人って結構優秀です。

しかし機械的(客観的)に行うとなるとなかなか難しいんです。
機械的(客観的)に行うためには何かしら数値化する必要があります。

逆に考えると、
特徴の大きさを表す指標を上手く定義できれば、機械的(客観的)に重要な部分特徴的な部分)を見つけることができそうです。

ここで、何を特徴の大きさを表す指標として定義するのか? という点に、その手法の哲学が含まれています。

私たち人間も、
「あなたの特徴的な点は何ですか?」
と問われると様々な回答ができると思います。

それと同じです。

皆さんはどのように答えるでしょうか?


様々な回答の仕方があると思いますが、
自分が他の人と違う点を自分の特徴として挙げることもできると思います。

実は主成分分析は、この違う点こそが特徴であるという哲学を前提にしています。
特徴に関する答えに唯一の正解はないので、ここは大きな哲学になっています。

他と大きな違いはなくても、特徴と言えるものもあるよね?
と聞かれるとそれも正しいと思います。

しかし、全ての特徴を考慮するとキリがないので今回は他との違いに注目します。
違いに特徴があるという前提で分析を進める以上、他と違いがない特徴を主成分分析で見つけることはできないということです。
この部分には注意が必要です。


他との違いを特徴と定義するのは良いとして、どのようにすれば他との違いを客観的に表現できるでしょうか?

ここで、データの分散という統計量に注目します。
分散はデータの平均との差を2乗したものの平均で、1つ1つのデータの離れ具合を意味します。各データが離れていればいるほど分散は大きくなり、まとまっていれば分散は小さくなります。

他との違いを表す指標として分散はちょうど良さそうです。

主成分分析では特徴の大きさを表す指標として(他との違いを表す)分散に注目します。
そして、特徴の大きさは分散の大きさで表現できると考えます。

今ある軸の分散だけを見ていれば良いのか?

さて、ここまでの流れをまとめるとこんな感じです。
・特徴というのは他との違いである
・他との違いは分散という指標で表現できる
・特徴の大きさは分散の大きさで表現できる

ここまでの話が成り立つとすると、
データの分散が大きい順に軸をピックアップすることで、重要な部分特徴的な部分)に絞り込むことができそうです。

例えば、国語・数学・理科・社会・英語の5教科のテスト結果があった場合、

{\bm D} = \begin{pmatrix} 国語_1 & 数学_1 & 理科_1 & 社会_1 & 英語_1 \\ 国語_2 & 数学_2 & 理科_2 & 社会_2 & 英語_2 \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ 国語_n & 数学_n & 理科_n & 社会_n & 英語_n \\ \end{pmatrix}

それぞれの教科ごとに分散を計算し、

{\bm {Var}} = \begin{pmatrix} 分散_{国語} & 分散_{数学} & 分散_{理科} & 分散_{社会} & 分散_{英語} \\ \end{pmatrix}

分散が大きかった教科(数学と英語が大きかった場合は数学と英語)だけを選んで他の教化の点を無視することでデータの中から重要な部分特徴的な部分)だけに絞り込むことができそう!という話です。

なるほど、面白い!!

それぞれの軸ごとに分散を求め、それを大きい順に並び変え、さらに適当な数に絞ることで重要な部分特徴的な部分)を表現することができれば、面倒な数学など必要ありません。簡単です。

1つのやり方としてアリかもしれません。

しかし、何個か問題がでてきそうです。


まず、国語・数学・理科・社会・英語の分散がたまたま全て同じだった場合、どのように選べば良いでしょうか?
自分が好きな教科を選んでしまって良いのでしょうか?
人によって結果が変わってしまうのは嬉しくありません。サイエンスとは言えません。

次に分散が数学・理科の順に大きかった場合、この2軸だけを選んでしまって本当に良いのでしょうか?
分散が大きかったとはいえ、文系科目の結果を上手く反映できていないような気がします。
このように似通った軸だけを選んでしまっては、データ全体の中から特徴的な部分を上手く抽出できた!とは言えなそうです。

さて、どうしたものかな、、、


ここで、国語・数学・理科・社会・英語の結果を上手く組み合わせて新しい軸を作り出すことを考えます。

ようするに軸の理解、分解、再構築をしようということです。
錬金術と同じです(^^)

1つ目の軸として、国語・数学・理科・社会・英語を上手く組み合わせて分散が最も大きい軸を作り、
2つ目の軸では1つ目の軸で取り入れた情報を除いた上で、国語・数学・理科・社会・英語を組み合わせて分散が大きい軸を作り、
3つ目の軸では1つ目と2つ目の軸で取り入れた情報を除いた上で、分散が大きい軸を作り、、、
ということを繰り返すことができれば、似通った情報を含む軸だけを選んでしまう問題も回避できそうです。

そして何より組み合わせた軸の中から分散の大きい順に何個か選ぶことで、重要な部分特徴的な部分)を抽出することができそうです。

そんなに都合よく軸を作成する方法があるのか?
という質問が来そうですが、信じられないことに主成分分析ではそれをやっています。
(考えた人頭良すぎです^^)

主成分分析の理論

元の軸を組み合わせて分散の大きい軸を作ると書きましたが、組み合わせる方法は無限にあります。
そこで、今回は元の軸を重み付けして合計を求めること(元の軸の線形和)で組み合わせることにします。

具体的に軸を組み合わせた後のi番目の学生の値は

軸を組み合わせた後のi番目の学生の値 = 国語の点数の重み \times i番目の学生の国語の点数 + 数学の点数の重み \times i番目の学生の数学の点数 + 理科の点数の重み \times i番目の学生の理科の点数 + 社会の点数の重み \times i番目の学生の社会の点数 + 英語の点数の重み \times i番目の学生の英語の点数

という形で表現できます。

全ての学生に対して軸を組み合わせた後の値を求め、その分散(平均を引いて2乗したものの平均)を最大にする国語の点数の重み, 数学の点数の重み, 理科の点数の重み, 社会の点数の重み, 英語の点数の重みを求めることで重要な部分特徴的な部分)を表現するための軸を再構築できそうです。

早速進めていきたいところですが、その前に上記の式では文字が多すぎるため少しずつ短くしていきます。

まず、軸を組み合わせた後のi番目の学生の値をf_i,
i番目の学生の各教科の点数を教科名_iとします。

f_i = 国語の点数の重み \times 国語_i + 数学の点数の重み \times 数学_i + 理科の点数の重み \times 理科_i + 社会の点数の重み \times 社会_i + 英語の点数の重み \times 英語_i

次に各教科の点数の重みをw_{教科名}とします。

f_i = w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i

だいぶ短くなりました(^^)
式の意味は3つとも同じです。

このfを全ての学生の分求め、fの分散

\begin{aligned} {s_{f}}^{2} &= \frac{1}{n} \{ {(f_1 - \bar{f})}^{2} + {(f_2 - \bar{f})}^{2} + \cdots + {(f_n - \bar{f})}^{2}\} \\ &= \frac{1}{n} \sum\limits_{i=1}^n {(f_i - \bar{f})^{2}} \\ \end{aligned}

が最大となる重みw_{国語}, w_{数学}, w_{理科}, w_{社会}, w_{英語}を求めていきます。

ここで、重み(w_{国語}, w_{数学}, w_{理科}, w_{社会}, w_{英語})に注目します。
実はこれ、何も制約が無いと無限の組み合わせが生じます。

例えば、
w_{国語}=1, w_{数学}=2, w_{理科}=1, w_{社会}=2, w_{英語}=1
の場合も
w_{国語}=2, w_{数学}=4, w_{理科}=2, w_{社会}=4, w_{英語}=2
の場合も
式の意味は同じですが、値が異なってしまいます。

無限の組み合わせが生じることは嬉しくないので、
重みの2乗和が1という制約を加えます。

数式で表すと

{w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 = 1

です。


さて、ここまでで最適化したい式と制約条件が出てきました。

最適化したい式は元の軸を(重み付けした合計で)組み合わせた後の各データの分散

\begin{aligned} {s_{f}}^{2} &= \frac{1}{n} \{ {(f_1 - \bar{f})}^{2} + {(f_2 - \bar{f})}^{2} + \cdots + {(f_n - \bar{f})}^{2}\} \\ &= \frac{1}{n} \sum\limits_{i=1}^n {(f_i - \bar{f})^{2}} \\ \end{aligned}

でした。

ここでi番目の学生の値f_iとその平均\bar{f}

f_i = w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i
\begin{aligned} \bar{f} &= \frac{1}{n} \sum\limits_{i=1}^n f_i \\ &= \frac{1}{n} \biggr \{ (f_1 + f_2 + \cdots + f_n) \biggr\} \\ &= \frac{1}{n} \biggr \{ (w_{国語} \times 国語_1 + w_{数学} \times 数学_1 + w_{理科} \times 理科_1 + w_{社会} \times 社会_1 + w_{英語} \times 英語_1) + (w_{国語} \times 国語_2 + w_{数学} \times 数学_2 + w_{理科} \times 理科_2 + w_{社会} \times 社会_2 + w_{英語} \times 英語_2) + \cdots + (w_{国語} \times 国語_n + w_{数学} \times 数学_n + w_{理科} \times 理科_n + w_{社会} \times 社会_n + w_{英語} \times 英語_n) \biggr \} \\ \end{aligned}

です。

制約条件は

{w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 = 1

でした。

ここで右辺の1を移行して

{w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 - 1 = 0

の形にすることでラグランジュの未定乗数法が使えるようになります。

最適化したい式の変数は各教科の重み(w_{国語}, w_{数学}, w_{理科}, w_{社会}, w_{英語})です。

ラグランジュ関数L

\begin{aligned} L &= \{最適化したい式\} - \lambda \{イコール0が成り立つ式\} \\ &= {s_{f}}^{2} - \lambda ({w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 - 1) \\ &= \frac{1}{n} \{ {(f_1 - \bar{f})}^{2} + {(f_2 - \bar{f})}^{2} + \cdots + {(f_n - \bar{f})}^{2}\} - \lambda ({w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 - 1) \\ &= \frac{1}{n} \sum\limits_{i=1}^n {(f_i - \bar{f})^{2}} - \lambda ({w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 - 1)\\ \end{aligned}

ここで1項目の{(f_i - \bar{f})}^{2}の部分は

\begin{aligned} {(f_i - \bar{f})}^{2} &= \biggr\lbrack (w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i) - \frac{1}{n} \biggr \{ (w_{国語} \times 国語_1 + w_{数学} \times 数学_1 + w_{理科} \times 理科_1 + w_{社会} \times 社会_1 + w_{英語} \times 英語_1) + (w_{国語} \times 国語_2 + w_{数学} \times 数学_2 + w_{理科} \times 理科_2 + w_{社会} \times 社会_2 + w_{英語} \times 英語_2) + \cdots + (w_{国語} \times 国語_n + w_{数学} \times 数学_n + w_{理科} \times 理科_n + w_{社会} \times 社会_n + w_{英語} \times 英語_n) \biggr \} \biggr\rbrack ^ 2 \end{aligned}

となっています。
各教科の重みの関数となっていることが分かると思います。

{s_{f}}^{2}が局所解をもつ場合、
\frac{\partial L}{\partial w_{国語}} = 0, \frac{\partial L}{\partial w_{数学}} = 0, \frac{\partial L}{\partial w_{理科}} = 0, \frac{\partial L}{\partial w_{社会}} = 0, \frac{\partial L}{\partial w_{英語}} = 0, \frac{\partial L}{\partial \lambda} = 0が成り立ちます。

1つずつ見ていきます。
w_{国語}で偏微分する場合を考えていきます。

\begin{aligned} \frac{\partial L}{\partial w_{国語}} &= 0 \\ \end{aligned}
\frac{\partial}{\partial w_{国語}} \biggr\lbrack \frac{1}{n} \sum\limits_{i=1}^n {(f_i - \bar{f})^{2}} - \lambda ({w_{国語}}^2 + {w_{数学}}^2 + {w_{理科}}^2 + {w_{社会}}^2 + {w_{英語}}^2 - 1) \biggr\rbrack = 0

1項目は合成関数の微分、2項目はw_{国語}の関数となっています。

\begin{aligned} \frac{1}{n} \sum\limits_{i=1}^n \biggr\lbrack 2(f_i - \bar{f}) \{\frac{\partial}{\partial w_{国語}}{(f_i - \bar{f})}\} \biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}
\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \biggr\lbrack (f_i - \bar{f}) \{\frac{\partial}{\partial w_{国語}}{(f_i - \bar{f})}\} \biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}
\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack (f_i - \bar{f}) \frac{\partial}{\partial w_{国語}} \biggr\lbrack {(w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i) - \biggr\{ \frac{1}{n} \sum\limits_{i=1}^n {(w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i)} \biggr\}} \biggr\rbrack \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

w_{国語}で偏微分すると、2項目はw_{国語}が含まれていない項はすべて消えるので、

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \biggr\lbrack (f_i - \bar{f}) \{ {国語_i - \frac{1}{n} \sum\limits_{i=1}^n {国語_i}} \} \biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

\frac{1}{n} \sum\limits_{i=1}^n {国語_i} は国語の平均点を意味しているので、

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \biggr\lbrack (f_i - \bar{f}) (国語_i - 国語の平均) \biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

と表すことができます。
次に{(f_i - \bar{f})}の部分を展開していきます。

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack \biggr\lbrack {(w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i) - \biggr\{ \frac{1}{n} \sum\limits_{i=1}^n {(w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i)} \biggr\}} \biggr\rbrack (国語_i - 国語の平均) \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

2項目の\frac{1}{n} \sum\limits_{i=1}^nを分配していくと、

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack \biggr\lbrack {(w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i) - \biggr\{ w_{国語} \frac{1}{n} \sum\limits_{i=1}^n {国語_i} + w_{数学} \frac{1}{n} \sum\limits_{i=1}^n {数学_i} + w_{理科} \frac{1}{n} \sum\limits_{i=1}^n {理科_i} + w_{社会} \frac{1}{n} \sum\limits_{i=1}^n {社会_i} + w_{英語} \frac{1}{n} \sum\limits_{i=1}^n {英語_i} \biggr\}} \biggr\rbrack (国語_i - 国語の平均) \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

\frac{1}{n} \sum\limits_{i=1}^n {国語_i} は国語の平均点, \frac{1}{n} \sum\limits_{i=1}^n {数学_i} は数学の平均点, \frac{1}{n} \sum\limits_{i=1}^n {理科_i} は理科の平均点, \frac{1}{n} \sum\limits_{i=1}^n {社会_i} は社会の平均点, \frac{1}{n} \sum\limits_{i=1}^n {英語_i} は英語の平均点なので

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack \biggr\lbrack {(w_{国語} \times 国語_i + w_{数学} \times 数学_i + w_{理科} \times 理科_i + w_{社会} \times 社会_i + w_{英語} \times 英語_i) - \biggr\{ w_{国語} \times {国語の平均} + w_{数学} \times {数学の平均} + w_{理科} \times {理科の平均} + w_{社会} \times {社会の平均} + w_{英語} \times {英語の平均} \biggr\}} \biggr\rbrack (国語_i - 国語の平均) \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

\Biggr\lbrack \Biggr\rbrack内2項目を-1をかけて中括弧を外し各項を移動すると

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack \biggr\lbrack { w_{国語} \times 国語_i - w_{国語} \times {国語の平均} + w_{数学} \times 数学_i - w_{数学} \times {数学の平均} + w_{理科} \times 理科_i - w_{理科} \times {理科の平均} + w_{社会} \times 社会_i - w_{社会} \times {社会の平均} + w_{英語} \times 英語_i - w_{英語} \times {英語の平均} } \biggr\rbrack (国語_i - 国語の平均) \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

各教科の重みw_{教科}でくくると、

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack \biggr\lbrack { w_{国語} \times (国語_i - {国語の平均}) + w_{数学} \times (数学_i - {数学の平均}) + w_{理科} \times (理科_i - {理科の平均}) + w_{社会} \times (社会_i - {社会の平均}) + w_{英語} \times (英語_i - {英語の平均}) } \biggr\rbrack (国語_i - 国語の平均) \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

(国語_i - 国語の平均)を分配すると

\begin{aligned} 2 \frac{1}{n} \sum\limits_{i=1}^n \Biggr\lbrack { w_{国語} \times {(国語_i - {国語の平均})}^{2} + w_{数学} \times (国語_i - 国語の平均)(数学_i - {数学の平均}) + w_{理科} \times (国語_i - 国語の平均)(理科_i - {理科の平均}) + w_{社会} \times (国語_i - 国語の平均)(社会_i - {社会の平均}) + w_{英語} \times (国語_i - 国語の平均)(英語_i - {英語の平均}) } \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

\frac{1}{n} \sum\limits_{i=1}^nを分配すると

\begin{aligned} 2 \Biggr\lbrack { w_{国語} \times \frac{1}{n} \sum\limits_{i=1}^n {(国語_i - {国語の平均})}^{2} + w_{数学} \times \frac{1}{n} \sum\limits_{i=1}^n (国語_i - 国語の平均)(数学_i - {数学の平均}) + w_{理科} \times \frac{1}{n} \sum\limits_{i=1}^n (国語_i - 国語の平均)(理科_i - {理科の平均}) + w_{社会} \times \frac{1}{n} \sum\limits_{i=1}^n (国語_i - 国語の平均)(社会_i - {社会の平均}) + w_{英語} \times \frac{1}{n} \sum\limits_{i=1}^n (国語_i - 国語の平均)(英語_i - {英語の平均}) } \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}

分散と共分散の定義より

\begin{aligned} 2 \Biggr\lbrack { w_{国語} s_{国}^{2} + w_{数学} s_{国数} + w_{理科} s_{国理} + w_{社会} s_{国社} + w_{英語} s_{国英} } \Biggr\rbrack - 2 \lambda w_{国語} &= 0 \\ \end{aligned}
\begin{aligned} 2 \Biggr\lbrack { w_{国語} s_{国}^{2} + w_{数学} s_{国数} + w_{理科} s_{国理} + w_{社会} s_{国社} + w_{英語} s_{国英} } \Biggr\rbrack &= 2 \lambda w_{国語} \\ \end{aligned}
\begin{aligned} w_{国語} s_{国}^{2} + w_{数学} s_{国数} + w_{理科} s_{国理} + w_{社会} s_{国社} + w_{英語} s_{国英} &= \lambda w_{国語} \\ \end{aligned}

数学、理科、社会、英語でも同じ計算が成り立つので、
\frac{\partial L}{\partial w_{数学}} = 0, \frac{\partial L}{\partial w_{理科}} = 0, \frac{\partial L}{\partial w_{社会}} = 0, \frac{\partial L}{\partial w_{英語}} = 0, \frac{\partial L}{\partial \lambda} = 0の結果はそれぞれ、

\begin{aligned} w_{国語} s_{国数} + w_{数学} s_{数}^{2} + w_{理科} s_{数理} + w_{社会} s_{数社} + w_{英語} s_{数英} &= \lambda w_{数学} \\ w_{国語} s_{国理} + w_{数学} s_{数理} + w_{理科} s_{理}^{2} + w_{社会} s_{理社} + w_{英語} s_{理英} &= \lambda w_{理科} \\ w_{国語} s_{国社} + w_{数学} s_{数社} + w_{理科} s_{理社} + w_{社会} s_{社}^{2} + w_{英語} s_{社英} &= \lambda w_{社会} \\ w_{国語} s_{国英} + w_{数学} s_{数英} + w_{理科} s_{理英} + w_{社会} s_{社英} + w_{英語} s_{英}^{2} &= \lambda w_{英語} \\ \end{aligned}

5教科全ての結果を行列としてまとめると

\begin{aligned} \begin{pmatrix} s_{国}^{2} & s_{国数} & s_{国理} & s_{国社} & s_{国英} \\ s_{国数} & s_{数}^{2} & s_{数理} & s_{数社} & s_{数英} \\ s_{国理} & s_{数理} & s_{理}^{2} & s_{理社} & s_{理英} \\ s_{国社} & s_{数社} & s_{理社} & s_{社}^{2} & s_{社英} \\ s_{国英} & s_{数英} & s_{理英} & s_{社英} & s_{英}^{2} \\ \end{pmatrix} \begin{pmatrix} w_{国語} \\ w_{数学} \\ w_{理科} \\ w_{社会} \\ w_{英語} \\ \end{pmatrix} &= \lambda \begin{pmatrix} w_{国語} \\ w_{数学} \\ w_{理科} \\ w_{社会} \\ w_{英語} \\ \end{pmatrix} \end{aligned}

ここで、
\begin{pmatrix} s_{国}^{2} & s_{国数} & s_{国理} & s_{国社} & s_{国英} \\ s_{国数} & s_{数}^{2} & s_{数理} & s_{数社} & s_{数英} \\ s_{国理} & s_{数理} & s_{理}^{2} & s_{理社} & s_{理英} \\ s_{国社} & s_{数社} & s_{理社} & s_{社}^{2} & s_{社英} \\ s_{国英} & s_{数英} & s_{理英} & s_{社英} & s_{英}^{2} \\ \end{pmatrix}\mathbf{S}, \begin{pmatrix} w_{国語} \\ w_{数学} \\ w_{理科} \\ w_{社会} \\ w_{英語} \\ \end{pmatrix}\mathbf{w}とすると、

\begin{aligned} \mathbf{S} \mathbf{w} &= \lambda \mathbf{w} \end{aligned}

となり元の軸を重みづけして合計するという方法(元の軸の線形和)で新しい軸を作成する場合、作成後の軸の分散が最大となる重み\mathbf{w}は、各教科の分散と教科同士の共分散をまとめた行列(分散共分散行列)\mathbf{S}の固有ベクトルであることが分かります。

固有ベクトルを分散(固有値)の大きい順に選ぶことで特徴的な部分を残しながら、軸の数を削減(次元削減)することができます。

ここで、国語と数学の共分散と数学と国語の共分散は同じなので、分散共分散行列は対称行列(転置しても元の行列と一致する行列)になります。
さらに分散も共分散も実数なので分散共分散行列は実対称行列になります。
実対称行列の固有ベクトル同士は互いに直交する(ベクトル同士の内積が0となる)ので、固有ベクトル同士は線形独立(軸同士がそれぞれの軸の線形結合で表現できない関係)となります。
よって適当にベクトルを複数選んだとしても似通った要素を含む軸だけを抽出してしまう、というような問題も生じないことがわかります。

まとめ

ここまでの話をまとめていきます。
主成分分析ではデータ同士の違いに特徴があるという前提でデータの違いを分散で表現しました。
元の軸の線形和で新しい軸を作成することにして、新しく作成した軸の分散が大きくなるように最適化を行いました。
結果的に、元の軸の分散共分散行列の固有ベクトルが新しい軸を作成するための線形和の重みパラメータ、固有値が分散として求まることが分かりました。
分散の大きな順に軸を絞ることで、データの特徴を残しながら軸の数を減らすことができます。

参考

https://qiita.com/oki_kosuke/items/70c7e0bcd7b534589f69

https://qiita.com/Ken-ichi_Hironaka/items/c7d99d6d1dee2f3f936f

Goals Tech Blog

Discussion