【カーネル法】R でカーネルPCAとカーネルCCAを実践

SVMで有名なカーネル法ですが, 今回はカーネル法を用いた カーネルPCA, カーネルCCA を R で実践してみました。参考にさせて頂いた書籍はカーネル法入門―正定値カーネルによるデータ解析 (シリーズ 多変量データの統計科学)で, 内容は 1章 カーネル法への招待, 3章 カーネル法の実際 についてですが, 数学的な話には触れないので本書をご覧ください。

カーネル法

カーネル法はデータの高次モーメントを有効に抽出しつつ計算を効率化する非線形変換の方法論で, データ分析の前処理やノイズ除去などに使われる。SVMが牽引する形で急速に広がり, 応用は下記のように多岐にわたる。

  • サポートベクターマシン (SVM)
  • カーネル主成分分析 (Kernel-PCA)
  • カーネル正準相関分析 (Kernel-CCA)
  • カーネルFisher判別分析
  • カーネルK-means
  • カーネルPLA
  • カーネルロジスティック回帰

カーネル法の基本的なアイデアの確認として, 下記のような線形識別不能な2次元の同心円状のデータ [1]の非線形変換を考える。

circle

視覚的にも線形分離できる分離超平面がないことが直感としてわかるが, 線形を検出できる PCA (Principal Component Analysis; PCA) を考えてみる。 PCAは最大の分散が得られる方向のベクトルを選択し, この線形の軸と直交する方向で最大の分散が得られる軸を選ぶ手順を削減したい次元数まで繰り返す。 しかし, 上記の同心円状のデータではどの軸を選んでもほぼ分散が変わらないため次元削減が上手くできない。

ここで下記のような明示的な非線形変換を行う。

     \begin{eqnarray*}   \{x_1, x_2\} \rightarrow \{x_1^2, x_2^2, \sqrt{2} x_1 x_2\} \end{eqnarray*}

非線形変換後のデータをプロットしてみると線形分離できそうなことがわかる。

circle-nonlinear-conversion

上記のようなデータであれば, 明示的な非線形変換がイメージできそうだが, より高次元で複雑な非線形データの場合はどのような変換をすれば良いかわかりにくい。
カーネル法は非線形変換を一般化した手法で, カーネル法で元のデータ空間 D を特徴写像により 3次元特徴空間 H に写す非線形変換を行うと下記となる。

circle-kpca

RでカーネルPCA

本書に倣い13個の特徴量を持つ Wine データセットに対して, 主成分分析 (Principal Component Analysis; PCA) と, カーネル主成分分析を行ってみる。

> head(d)
  class Alcohol Malic Acid  Ash Alcalinity of Ash Magnesium Total Phenols Flavanoids
1     1   14.23       1.71 2.43              15.6       127          2.80       3.06
2     1   13.20       1.78 2.14              11.2       100          2.65       2.76
3     1   13.16       2.36 2.67              18.6       101          2.80       3.24
4     1   14.37       1.95 2.50              16.8       113          3.85       3.49
5     1   13.24       2.59 2.87              21.0       118          2.80       2.69
6     1   14.20       1.76 2.45              15.2       112          3.27       3.39
  Nonflavanoid Phenols Proanthocyanins Color Intensity  Hue 0D280/OD315 of Diluted Wines Proline
1                 0.28            2.29            5.64 1.04                         3.92    1065
2                 0.26            1.28            4.38 1.05                         3.40    1050
3                 0.30            2.81            5.68 1.03                         3.17    1185
4                 0.24            2.18            7.80 0.86                         3.45    1480
5                 0.39            1.82            4.32 1.04                         2.93     735
6                 0.34            1.97            6.75 1.05                         2.85    1450

まずは通常の PCA の結果。

wine-pca

続いて, scale 処理した後に kernlab::kpca でカーネルPCAを行う。カーネルPCAの結果はカーネル選択に強く依存しており, ガウスカーネルではカーネルパラメータ σ が小さいと細長いクラスタとなり, σ が大きいと線形PCAと同等の結果となる。下記は カーネルにガウスカーネル, σ=0.5 として2次元に次元削減した結果。

wine-kpca

カーネルPCAでは, カーネル選択に強く依存する軸に分析的な解釈を与えることが妥当か注意することが必要となる。

RでカーネルCCA

正準相関分析(Canonical Correlation Analysis, CCA) は 2つの多変量データ X, Y に依存関係があるかどうかを調べる線形手法。
正準相関とは X をm次元、Y をl次元の確率ベクトルとした場合に a, b 方向に射影した1次元確率変数の相関係数の最大値で, XとYにほぼ線形の依存関係があれば、正準相関は 1 に近づく。

カーネルCCAは特徴空間上のデータに対して正準相関分析を行う手法。応用例のひとつとして, テキストによる画像検索があり X を画像データ, Y をテキストデータとしてカーネルCCAを行い、結果の固有空間を特徴空間として考え、テキストから画像を検索する。新たにテキストデータ Ynew が与えられた時に、その特徴に適した画像データ Xi を出力する。

円周上の500点のデータについて R で試してみる。

circle

x, y に対して通常の CCA で相関値を求めると 0.01 と非常に小さくなる。
続いて, kernlab::kcca() でカーネルCCAを行う。結果はカーネルPCA同様に カーネルの選択, 正則化係数 ε などパラメータに依存する。

circle-kcca

カーネルCCAでは相関値は -0.99 となった。
Codeは GitHub に置いた。

おわりに

今回はカーネル法を用いた主成分分析, 正準相関分析を R で試してみました。 最後に本書の要約的な内容のPDF [2, 3, 4] を参考として載せておきます。


[1] numpyでの人工的データ生成
[2] カーネル法入門 1.カーネル法へのイントロダクション
[3] カーネル法による 非線形データ解析入門
[4] 3.さまざまなカーネル法
[5] カーネルとは直感的に説明するとなんなのか?