線形変換(無相関化と次元削減)
音声認識の前処理やパターン分類で使われる線形変換についてメモしておく。
ここでは、"無相関化"と"次元削減"の2つの視点でまとめてみる。
PCA(Principal Component Analysis;主成分分析)を想定。
2変数(x, y)で表されるの3つのサンプルデータがあったとする(相関係数は「1」、正の相関)。
固有ベクトル
$vectors vectors [,1] [,2] [1,] 0.4472127 -0.8944276 [2,] 0.8944276 0.4472127
基底ベクトルをu1、u2とおくと、固有値「333.33333」に属する固有ベクトルu1は(0.4472127, 0.8944276)、固有値「0.00036」に属する固有ベクトルu2は(-0.8944276, 0.4472127)
u2に関してはマイナスを掛けた(0.8944276, -0.4472127)としても表してもよい。
(ベクトルの符号が変わることは、広義的には方向が変わらないと解釈する)
このことを確かめるために、特異値分解を行って直交行列を求めてみる。
C++の行列ライブラリEigenのJacobiSVDを使用。
MatrixXd m(2,2); m<< 66.6667,133.333, 133.333,266.667; JacobiSVD<MatrixXd> svd(m, ComputeThinU | ComputeThinV); MatrixXd U,S,V; S=svd.singularValues(); U=svd.matrixU(); V=svd.matrixV();
計算結果は、分解前の分散共分散行列と等しいことを確認。
U * S.asDiagonal() * V.transpose() 66.6667 133.333 133.333 266.667
基底ベクトルをu1、u2とすると、座標変換は以下のように表される。
(u2に関しては特異値分解で得られたベクトルを使用)
座標の線形変換については以下のサイトが分かりやすい。
http://eman-physics.net/math/linear08.html
もともとデカルト座標で(x,y,z)で表されていたものが新しい基底のもとでどのように表されるかを知りたければ、基底を縦のベクトルとして行列の中に放りこんでやったものを作り、その逆行列を元の座標に掛ければ終わりである。
2つの基底ベクトルを並べた行列は直交行列なので、逆行列と転置行列は同じになる。
(以下、転置行列の形で表す)
各点に対して座標変換を実行。
この座標は、標準基底(1, 0)、(0, 1)ではなく、新基底(0.4472127, 0.8944276)、(0.8944276, -0.4472127)のもとで表される座標であることに留意。
出てきた座標が、標準基底のものなのか、あるいは固有ベクトルを基底としたものなのか混乱したので、別途、整理。
work-in-progress.hatenablog.com
無相関化
変換後の座標の分散共分散行列は以下のとおり。
非対角成分が(ほぼ)0なので、2成分間に相関はないことが確認できる。
u1を基底ベクトルとする軸上への射影した値(2つのベクトルの内積で求まるスカラー)
点1 : (20, 20) ・ ( 0.447213, 0.894428 ) = 26.8328
点2 : (30, 40) ・ ( 0.447213, 0.894428 ) = 49.1935
点3 : (40, 60) ・ ( 0.447213, 0.894428 ) = 71.5542
u2を基底ベクトルとする軸上への射影した値(2つのベクトルの内積で求まるスカラー)
点1 : (20, 20) ・ ( 0.894428, -0.447213 ) = 8.9443
点2 : (30, 40) ・ ( 0.894428, -0.447213 ) = 8.94432
点3 : (40, 60) ・ ( 0.894428, -0.447213 ) = 8.94434
u1を基底ベクトルとする軸上へ射影した座標
点1 : 26.8328 * u1 = 26.8328 * ( 0.447213, 0.894428) = (12, 24)
点2 : 49.1935 * u1 = 49.1935 * ( 0.447213, 0.894428) = (22, 44)
点3 : 71.5542 * u1 = 71.5542 * ( 0.447213, 0.894428) = (32, 64.0001)
「*」は定数倍を表す
u2を基底ベクトルとする軸上へ射影した座標
点1 : 8.9443 * u2 = 8.9443 * ( 0.894428, -0.447213) = (8.00003, -4.00001)
点2 : 8.94432 * u2 = 8.94432 * ( 0.894428, -0.447213) = (8.00005, -4.00002)
点3 : 8.94434 * u2 = 8.94434 * ( 0.894428, -0.447213) = (8.00007, -4.00003)
「*」は定数倍を表す
射影後の座標をプロットすると下図のとおり。
u1を基底ベクトルとする軸上へ射影した座標(12, 24)の新座標での表現は以下のとおりとなる。
点(20, 20)を座標変換した新座標と比べてみると、
基底ベクトルの軸上に射影した座標は、x成分が同じで、y成分がゼロになっていることを確認できる。