ichou1のブログ

主に音声認識、時々、データ分析のことを書く

線形変換(無相関化と次元削減)

音声認識の前処理やパターン分類で使われる線形変換についてメモしておく。
ここでは、"無相関化"と"次元削減"の2つの視点でまとめてみる。
PCA(Principal Component Analysis;主成分分析)を想定。

2変数(x, y)で表されるの3つのサンプルデータがあったとする(相関係数は「1」、正の相関)。
f:id:ichou1:20181005220449p:plain

f:id:ichou1:20180514211824p:plain

分散共分散行列(variance covariance matrix)

f:id:ichou1:20180517205517p:plain

このデータに対して、固有値分解を実行した結果(Rで計算)

固有値
$values
[1] 3.333333e+02 3.599997e-04

固有値は「333.33333」と「0.00036」

固有ベクトル
$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();

f:id:ichou1:20180517210450p:plain

計算結果は、分解前の分散共分散行列と等しいことを確認。

U * S.asDiagonal() * V.transpose()
66.6667 133.333
133.333 266.667

基底ベクトルをu1、u2とすると、座標変換は以下のように表される。
u2に関しては特異値分解で得られたベクトルを使用)
f:id:ichou1:20181005224440p:plain

座標の線形変換については以下のサイトが分かりやすい。
http://eman-physics.net/math/linear08.html

もともとデカルト座標で(x,y,z)で表されていたものが新しい基底のもとでどのように表されるかを知りたければ、基底を縦のベクトルとして行列の中に放りこんでやったものを作り、その逆行列を元の座標に掛ければ終わりである。

2つの基底ベクトルを並べた行列は直交行列なので、逆行列と転置行列は同じになる。
(以下、転置行列の形で表す)

各点に対して座標変換を実行。
f:id:ichou1:20180517215627p:plain
f:id:ichou1:20180517215645p:plain
f:id:ichou1:20180517215655p:plain

この座標は、標準基底(1, 0)、(0, 1)ではなく、新基底(0.4472127, 0.8944276)、(0.8944276, -0.4472127)のもとで表される座標であることに留意。
出てきた座標が、標準基底のものなのか、あるいは固有ベクトルを基底としたものなのか混乱したので、別途、整理。
work-in-progress.hatenablog.com

無相関化

変換後の座標の分散共分散行列は以下のとおり。
f:id:ichou1:20180517222011p:plain

非対角成分が(ほぼ)0なので、2成分間に相関はないことが確認できる。


次元削減

各点を1次元の部分空間に投影する。
座標ベクトルと基底ベクトルの内積によって、u1またはu2を基底ベクトルとする軸に射影した値(スカラー)が求まる。

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)
「*」は定数倍を表す

射影後の座標をプロットすると下図のとおり。
f:id:ichou1:20181006093937p:plain

u1を基底ベクトルとする軸上へ射影した座標(12, 24)の新座標での表現は以下のとおりとなる。
f:id:ichou1:20181006095924p:plain

点(20, 20)を座標変換した新座標と比べてみると、
f:id:ichou1:20181006100229p:plain

基底ベクトルの軸上に射影した座標は、x成分が同じで、y成分がゼロになっていることを確認できる。