主成分分析のあれこれ
主成分分析の拡張である確率的主成分分析,ベイズ的主成分分析,カーネル主成分分析の比較
主成分分析(PCA)
高次元のデータを低次元に次元削減する方法
色々求め方はあるが,特異値分解と解釈するのが早い
$$ X = UDV^T $$
- $X$: サンプル数×次元数の元データ
- $U$: ×次元数のユニタリー行列
- $D$: 次元数×次元数の対角行列(対角成分は固有値)
- $V^T$: 次元数×次元数の固有ベクトル行列(行が1つの固有ベクトル)
さらに次元削減のベクトルは
$$ X_{pca} = XV_{pca} $$
で求めることができる.
ただし$V_{pca}$は行列Vから削減した次元数から作成する.(2次元に次元削減したのなら,$V_{pca} = V[:,[0,1]]$)
確率的主成分分析(Probabilistic PCA)
ガウス分布を用いて確率的に次元削減を行う
求め方は複数あるが,EMアルゴリズムで求める場合,
E-stepでは
M = W^TW+\sigma^2I \\
E[z_n] = M^{-1}W^T(x_n-\bar{x}) \\
E[z_{n}z_{n}^T]=\sigma^2M^{-1}+E[z_n]E[z_n]^T
ただし,
- $M$: 削減後の次元数×削減後の次元数の行列
- $W$: 元の次元数×削減後の次元数の行列(ランダムに初期化)
- $\sigma^2$: スカラー
- $I$: 単位行列
- $E[z_n]$: n番目のデータの次元削減後のベクトル
- $x_n$: n番目のデータの次元削減前のベクトル
- $\bar{x}$: 次元削減前のデータの平均ベクトル
- $E[z_nz_n^T]$: 削減後の次元数×削減後の次元数の行列
M-stepでは
W = \bigl[\sum_{n=1}^{N}(x_n-\bar{x})E[z_n]^T\bigr]\bigl[\sum_{n=1}^{N}E[z_nz_n^T]\bigr]^{-1}\\
\sigma^{2} = \frac{1}{ND}\sum_{n=1}^{N}\bigl\{||x_n-\bar{x}||^2 - 2E[z_n]^TW^T(x_n-\bar{x}) + Tr(E[z_nz_n^T]W^TW)\bigr\}
ただし,
- N: データ数
- D: 元の次元数
で求めることができる.
ベイズ的主成分分析(Bayes PCA)
ガウス分布にハイパーパラメータを導入してベイズ推定を行う.
Probabilistic PCAの場合と比較して,M-stepが異なり,
\alpha_i = \frac{D}{w_i^Tw_i} \\
W = \bigl[\sum_{n=1}^{N}(x_n-\bar{x})E[z_n]^T\bigr]\bigl[\sum_{n=1}^{N}E[z_nz_n^T] + \sigma^2A \bigr]^{-1}\\
\sigma^{2} = \frac{1}{ND}\sum_{n=1}^{N}\bigl\{||x_n-\bar{x}||^2 - 2E[z_n]^TW^T(x_n-\bar{x}) + Tr(E[z_nz_n^T]W^TW)\bigr\}
ただし,
- $w_i$: 行列Wのi行目のベクトル
- $A$: $diag(\alpha_i)$
である.
カーネル主成分分析
カーネルによって,データ数×次元数の行列をデータ数×データ数の行列に変換したのちに主成分分析を行う
$$\tilde{K} = K - 1_{N}K - K1_N+1_NK1_N$$
ただし,
- $K$: i, j成分がkernel($x_i$, $x_j$)の行列
- 1_{N}: 全成分が$1/N$のデータ数×データ数の行列
このようにして求めた$\tilde{K}$に対して,主成分分析の時と同様に,固有値と固有ベクトルを求めることによって次元削減を行う
実験
主成分分析(PCA),確率的主成分分析(PPCA),ベイズ的主成分分析(BPCA),カーネル主成分分析(KPCA)を用いて次元削減を行う.
用いたデータはirisのデータ(3種類の植物のデータが4次元のベクトルで表現されている,各種類ごとに50データ存在する).
コードはここに
https://github.com/kenchin110100/machine_learning
2次元に次元削減後,プロットしたものが以下の図
- PCA

- PPCA

- BPCA

- KPCA

PCAよりも,PPCA,BPCAの方が種類間の境界線がはっきりとわかる.
KPCAはまた違う感じだが,確かに種類ごとにプロットができている.
終わりに
4種類の主成分分析を行なった,BPCAあたりは使い勝手が良さそう
PCAの拡張方法として確率的に求めるか,kernelを使うかという2軸があるが,
それらを組み合わせた最強の主成分分析なるものがあるらしい・・・