Help us understand the problem. What is going on with this article?

「主成分分析(PCA)」について

機械学習のエッセンスの第05章「機械学習アルゴリズム」で出て来た手法を、自分用にメモ
(回帰ロジスティック回帰分析サポートベクターマシンは別ページ)

主成分分析(PCA)とは

  • 機械学習のうち、教師なし学習の次元圧縮に用いられる手法の一種。元データの情報をできるだけ損わずに低次元空間に縮約する
  • 次元圧縮: 多次元データを視覚化するために、2次元・3次元データに縮約する。

考え方

  • 元データを、分散が大きくなるようにベクトル変換する。
  • 分散が大きいベクトルを選び、射影する(一次元なら分散が一番大きいもの、二次元なら分散が大きい順に2つ)
  • 次数を削るのでどうしても情報量は減るが、できるだけばらつきが大きくなるように変換して射影することで、残る情報量が多くなる。(特徴が見えやすくなる)
  • 実際に「 https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/ 」にある「winequality-red.csv」や「winequality-white.csv」(11次元データ)を二次元に圧縮してプロットすると↓のようになる。

PCA_1.png
PCA_2.png

解き方

  • 元データ$x$の数を$n$, 1つずつのデータの次数を$d$として、$\mathbf{x_i} = (x_1, x_2, \cdots, x_d) \; (for \; i = 1, 2, \cdots, n)$と表す。(通常は$n>d$)
  • 変換するベクトルを$\mathbf{w}^T = (w_1, \cdots, w_d)$とする。
||\mathbf{w_i}||=1 \; \Leftrightarrow \; \mathbf{w_i}^T \mathbf{w_i} = 1
\\
\mathbf{w_i}^T \mathbf{w_j} =0 \; (for \; i \neq j)

一次元への圧縮

まず$\mathbf{w_1}$による一次元への変換・圧縮・射影を考える。
$\mathbf{x_i} \; (for \; i = 1, 2, \cdots, n)$の平均$\bar{\mathbf{x}}$は

\bar{\mathbf{x}} = \frac{1}{n} \sum_{n=1}^{n} \mathbf{x_i}

また、$\mathbf{w_1}^T \mathbf{x_i} \; (for \; i = 1, 2, \cdots, n)$の平均は

\frac{1}{n} \sum_{n=1}^{n} \mathbf{w_1}^T \mathbf{x_i} = \mathbf{w_1}^T \frac{1}{n} \sum_{n=1}^{n} \mathbf{x_i} = \mathbf{w_1}^T \bar{\mathbf{x}}

よって$\mathbf{w_1}^T \mathbf{x_i} \; (for \; i = 1, 2, \cdots, n)$の分散は

\begin{align}
&\frac{1}{n} \sum_{n=1}^{n} ||\mathbf{w_1}^T \mathbf{x_i} - \mathbf{w_1}^T \bar{\mathbf{x}}||^2 \\
= &\frac{1}{n} \sum_{n=1}^{n} ||\mathbf{w_1}^T (\mathbf{x_i} - \bar{\mathbf{x}})||^2 \\
= &\frac{1}{n} \sum_{n=1}^{n} \bigl( \mathbf{w_1}^T (\mathbf{x_i} - \bar{\mathbf{x}}) \bigr) \bigl( (\mathbf{x_i} - \bar{\mathbf{x}})^T \mathbf{w_1} \bigr) \\
= &\mathbf{w_1}^T \bigl( \frac{1}{n} \sum_{n=1}^{n} (\mathbf{x_i} - \bar{\mathbf{x}}) (\mathbf{x_i} - \bar{\mathbf{x}})^T \bigr) \mathbf{w_1} \\
= &\mathbf{w_1}^T \mathbf{S} \mathbf{w_1} \\
\end{align}

$\frac{1}{n} \sum_{n=1}^{n} (\mathbf{x_i} - \bar{\mathbf{x}}) (\mathbf{x_i} - \bar{\mathbf{x}})^T = \mathbf{S}$はd×d行列

よって解くべき最適化問題は↓になる(後の計算のために1/2した)

\begin{align}
Maximize \; &\frac{1}{2} \mathbf{w_1}^T \mathbf{S} \mathbf{w_1} \\
Subject \; to \; &\mathbf{w_1}^T \mathbf{w_1} = 1 \\
\Leftrightarrow \; &\mathbf{w_1}^T \mathbf{w_1} - 1 = 0 \\
\end{align}

コレをラグランジュの未定乗数法(Wikipedia)で解くと、ラグランジュ関数は

L(\mathbf{w_1}, \lambda_1) = \frac{1}{2} \mathbf{w_1}^T \mathbf{S} \mathbf{w_1} - \lambda_1 (\mathbf{w_1}^T \mathbf{w_1} - 1) \; \cdots (i)

となり

\frac{\partial L}{\partial \mathbf{w_1}} = \mathbf{S} \mathbf{w_1} - \lambda_1 \mathbf{w_1} = 0 \\
\mathbf{S} \mathbf{w_1} = \lambda_1 \mathbf{w_1} \\

より、$\lambda_1$は$\mathbf{S}$の固有値となる。
このとき$\mathbf{w_1}^T \mathbf{S} \mathbf{w_1} = \mathbf{w_1}^T \lambda_1 \mathbf{w_1} = \lambda_1$なので、$\frac{1}{2} \mathbf{w_1}^T \mathbf{S} \mathbf{w_1}$を最大とするためには$\lambda_1$を最大とすればよい。
$(i)$を満たす$\mathbf{w_1}$は複数あるので、そのうち$\lambda_1$が最大のものを見つければよい。
(二次元の場合は$\lambda$が大きい順に2つ、三次元の場合は3つ見つければよい)

PCAのアルゴリズム(多次元への射影)

ここで、

\mathbf{W} = (\mathbf{w_1}, \mathbf{w_2}, \cdots, \mathbf{w_d})

とおくと、

\mathbf{S} \mathbf{w_1} = \lambda_1 \mathbf{w_1} \\
\mathbf{S} \mathbf{w_2} = \lambda_2 \mathbf{w_2} \\
\vdots \\
\mathbf{S} \mathbf{w_d} = \lambda_d \mathbf{w_d} \\

となり、まとめると

\mathbf{S} \mathbf{W} = \mathbf{W} \mathbf{\Lambda} \\

となる。ここで$\mathbf{\Lambda}$は

\mathbf{\Lambda} = \begin{pmatrix}
\lambda_1 & & & \\
 & \lambda_2 & & \\
 & & \ddots & \\
& & & \lambda_d
\end{pmatrix}\\

最初の$\mathbf{w}$のおきかた$||\mathbf{w_i}||=1 , \; \mathbf{w_i}^T \mathbf{w_j} =0 \; (for \; i \neq j)$より$\mathbf{W}$は直行行列($\mathbf{W}^T = \mathbf{W}^{-1}$)なので

\mathbf{S} = \mathbf{W} \mathbf{\Lambda} \mathbf{W}^{-1} = \mathbf{W} \mathbf{\Lambda} \mathbf{W}^T \; \cdots (ii) \\

この形になると、$\mathbf{S}$がわかればSciPyの中の特異値分解(Singular Value Decomposition, SVD)を用いて$\mathbf{W}, \; \mathbf{\Lambda}$を求めることができるので、以下の流れでプロットできる。

  • (二次元でプロットする場合)$\lambda_i$が大きい順に$\mathbf{w_i}$を2つ取り出す。($\mathbf{w_i}, \mathbf{w_2}$)
  • $(\mathbf{w_1} \mathbf{w_2})^T \mathbf{x}$を計算し、プロットする。

ここで、

\mathbf{Y} = \begin{pmatrix}
(\mathbf{x_1} - \bar{\mathbf{x}})^T \\
(\mathbf{x_2} - \bar{\mathbf{x}})^T \\
\vdots \\
(\mathbf{x_n} - \bar{\mathbf{x}})^T \\
\end{pmatrix}

とおくと$\mathbf{S}$は以下のように計算できる。

\mathbf{S} = \frac{1}{n} \sum_{n=1}^{n} (\mathbf{x_i} - \bar{\mathbf{x}}) (\mathbf{x_i} - \bar{\mathbf{x}})^T = \frac{1}{n} \mathbf{Y}^T \mathbf{Y}

参考リンク

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした