主成分分析のイメージを掴んで実装してみる(1/2)

前回は次元削減の概要を掴んだ上で、特微量選択を行いました。なんか次元削減がわかってきたような気がします。そこでこの記事では、特微量抽出の方法として主成分分析を見ていきたいと思います。

ちなみにこの記事は「カーネル多変量解析」を読んでいるこのシリーズの脇道です。

この記事のゴール

  • 主成分分析とはなんぞやの概要を理解する

  • 共分散行列の固有ベクトルが主成分になるイメージを掴む

前回に引き続き、この本に大いに助けてもらっています。

主成分分析とはなんぞや

前回、機械学習をする前の前処理として次元圧縮をすることがあること、次元圧縮には特微量選択と特微量抽出があることを書きました。

そのあと、2つの方法のひとつ、特微量選択の例をひとつ実装してみました。特微量選択は、n個の特微量からd個の特微量だけを選ぶことでn次元からd次元にデータを圧縮する方法でした。

もう一方の特微量抽出は、n個の特微量を「いい感じに」組み合わせて新しい特微量d個を作り、n次元からd次元にデータを圧縮する方法です。「いい感じ」というのは、d個の新特微量で学習してもn個の元特微量のときに比べてモデルの予想が悪くない(もしくは良くなる)ような新特微量の作り方です。

今回の主役、主成分分析は特微量抽出の方法のひとつです。主成分分析は「いい感じ」にd個の新特微量を選ぶために、全データのバラツキが最もでるような軸を主成分として決め、そこを元にd次元の特微量を作っていきます。

どうしてバラツキが最もでるような軸が嬉しいのか。その軸で説明できることが多いからですね。以下の図をみるとイメージつくと思うのですが、二次元に散らばったデータに対して、ある一次元のデータだけ渡されてデータを特定するとすると、xの値をもらって推測するより、図の赤線に沿った特微量をもらった方が正確に予想できそうです。のでこの新特微量は元特微量のどれよりも、いい感じの特微量といえます。

データとその主成分

このとき注意しなくてはいけないのは、元の各特微量が同じスケールで作られている方がいいってことです。例えば、上の図で$${x_1}$$の値が$${x_2}$$の値の一億倍くらいのスケールだったとすると、赤い線ってほぼ真横になっちゃう=$${x_1}$$に大きく依存してしまいます。

そこで、全ての特微量を、その特微量の標準偏差でスケーリングします。式としては、$${(x^{(i)}_j - \bar{x_j})/\sigma_j + \bar{x_j}}$$の変換をします。平均からの差分を標準偏差で割ってあげるんですね。こう変換しても、各データ点の相対的な位置は変わりません(グラフの見え方は変わりません)。後で見るように、ただ軸の大きさが変わるだけです。

あと、各特微量の平均値を0にした方が計算上の都合(と理解のしやすさ)がいいのでそうします。具体的には、各特微量からその特微量の平均値を引きます。データを平行移動するだけなので、分析結果には変わりがありません(この変移動でさっきのスケーリングも$${x^{(i)}_j/\sigma_j}$$とシンプルになります)。

この、各特微量の平均値を0にして、標準偏差でスケーリングすることを標準化といいます。前処理である主成分分析の前処理として標準化をします。

主成分分析は全体としてはこんな感じで進むわけです。

  1. 各特微量を標準化する

  2. 特微量がn個あるデータに対して最もバラツキが大きくなるような軸を選ぶ

  3. それに直行する軸の中で最もバラツキが大きくなる軸を選ぶ

  4. 2をd-1回繰り返して、d本の軸を決める

  5. そのd本の軸でできた空間に元データを射影する

こうすることで、n次元をd次元に圧縮できます。行列でいうとデータに右から$${軸_1,軸_2,…}$$を掛けて圧縮します。で、前半の軸($${軸_1,軸_2}$$など)はデータをよく説明してくれるけど、後半になるとそうでもなくなるので、後半の軸いらないよね=次元削減できるよね、って考え方です。

主成分分析のやり方の字面を理解する

なんとなくイメージついた気がします。ので、じゃあ実際どうやるの?という話に入ります。

主成分分析のコアは、最もバラツキが大きくなるような軸を選ぶことでした。で、最もバラツキが大きくなるような軸は、サンプルデータの共分散行列の固有ベクトルのうち固有値が最大のものです。

うん、よくわかんないですね。僕はよくわかんなかったです。

のでこの章では「共分散行列」と「固有ベクトル」、「固有値」の言葉の意味を簡単に確認します。わかっている人は飛ばしてください。

共分散行列とは何か。

まず、「分散」があります。数値がどのくらい散らばっているかの指標ですね。データ$${x}$$の特微量$${x_1}}$$の分散は、平均値$${\bar{x_1}}$$から各データ点の距離で計算でき$${1/n\sum (x ^{(i)}_1 - \bar{x_1})^2}$$です。

で、「共分散」は2つの特微量$${x_1}$$と$${x_2}$$の関係性をしめす指標です。$${x_1}$$が大きくなると$${x_2}$$は小さくなるとか。式は$${1/n\sum (x ^{(i)}_1 - \bar{x_1}) (x ^{(i)}_2 - \bar{x_2})}$$です。

共分散を$${s_{x_1 x_2}}$$と書くことがあります。分散は同じ値の共分散とも考えられるので$${s_{x_1 x_1}}$$です。

で、共分散行列は下記の式で定義される行列です。$${x_1, x_2, …, x_n}$$がそれぞれ特微量です。分解して一番下のようにした方がイメージしやすい気がします(読みやすいように全ての特微量で$${\bar{x_i}=0}$$)と置いています)。
$${\begin{pmatrix}S_{x_1x_1}&S_{x_1x_2}&S_{x_1x_3}&…&S_{x_1x_n}\\S_{x_2x_1}&S_{x_2x_2}&S_{x_2x_3}&…&S_{x_2x_n}\\S_{x_3x_1}&S_{x_3x_2}&S_{x_3x_3}&…&S_{x_3x_n}\\…&…&…&…&…\\S_{x_nx_1}&S_{x_nx_2}&S_{x_nx_3}&…&S_{x_nx_n}\end{pmatrix}}$$
$${=1/n\sum\begin{pmatrix}x^{(i)}_1x^{(i)}_1&x^{(i)}_1x^{(i)}_2&x^{(i)}_1x^{(i)}_3&…&x^{(i)}_1x^{(i)}_n\\x^{(i)}_2x^{(i)}_1&x^{(i)}_2x^{(i)}_2&x^{(i)}_2x^{(i)}_3&…&x^{(i)}_2x^{(i)}_n\\x^{(i)}_3x^{(i)}_1&x^{(i)}_3x^{(i)}_2&x^{(i)}_3x^{(i)}_3&…&x^{(i)}_3x^{(i)}_n\\…&…&…&…&…\\x^{(i)}_nx^{(i)}_1&x^{(i)}_nx^{(i)}_2&x^{(i)}_nx^{(i)}_3&…&x^{(i)}_nx^{(i)}_n\end{pmatrix}}$$
$${=1/n\sum(\begin{pmatrix}x^{(i)}_1\\x^{(i)}_2\\x^{(i)}_3\\…\\x^{(i)}_n\end{pmatrix}\begin{pmatrix}x^{(i)}_1&x^{(i)}_2&x^{(i)}_3&…&x^{(i)}_n\end{pmatrix})}$$
$${=1/n\sum x^{(i)}x^{(i)T}}$$

さっき非表示した$${\bar{x_i}}$$を追加するなら、$${=1/n\sum (x^{(i)}-\bar{x_i})(x^{(i)}-\bar{x_i})^T}$$となります。標準化してあるなら、上の式のままで構いません。

次、「固有ベクトル」とは何か。

ある行列$${A}$$に対して、$${Ap=\lambda p}$$がなりたつ$${p}$$のことを$${A}$$の固有ベクトルと呼びます($${\lambda}$$はスカラー量)。

これだと謎なので意味合いを考えると、左から$${A}$$を掛けても、向きが変わらず、長さが$${\lambda}$$倍になるということです。

例として、下の図は行列$${\begin{pmatrix}3&1\\2&4\end{pmatrix}}$$を掛けたときの変換です。青の2本がその行列の固有ベクトル。変換前と変換後で長さは変わっても向きが変わってません。緑と黄色が比較のための適当なベクトル。向き変わってますね。

左の図に行列をかけた。固有ベクトル青は向きが変わっていない

最後に「固有値」。これは$${Ap=\lambda p}$$の$${\lambda}$$です。つまり$${A}$$の固有値とは、$${A}$$の固有ベクトル$${p}$$に左から$${A}$$をかけたとき、$${p}$$が何倍になるかです。

っていうことで、「最もバラツキが大きくなるような軸は、サンプルデータの共分散行列の固有ベクトルのうち固有値が最大のもの」という字面の意味を確認しました。字面だけ。

主成分分析をやってみる

字面の上では理解しましたが、ほんとかなぁ。やってみましょう。

2次元空間にサンプルが100個あったとします(左右2通りのデータでみてみます)。

標準化します。見た目は変わりませんが、軸の大きさが変わってます。

これらのデータの共分散行列とその行列の固有ベクトルはこうなります。

cov[[1.01010101 0.68756592] [0.68756592 1.01010101]]
eigen values[0.32253509 1.69766693]
eigen vector [[-0.70710678 -0.70710678] [ 0.70710678 -0.70710678]]

cov[[ 1.01010101 -0.54303211] [-0.54303211  1.01010101]]
eigen values[0.4670689  1.55313312]
eigen vector [[-0.70710678  0.70710678] [-0.70710678 -0.70710678]]

サンプルと固有ベクトルを描画すると一番データのバラツキが多い軸に見えます。おぉほんとだ。

なんでその固有ベクトルが主成分になるのか

その上で、なぜそうなるのか、のお話です。が、長くなってきたので次の記事に。あと、前回のwineデータで主成分分析を行い、逐次特微量選択との比較をしてみる予定です。
次:https://note.com/tanuki_112/n/na1be9058af98

この記事が気に入ったらサポートをしてみませんか?