No.16988 主成分スコアから元のデータを復元できますか?  【K】 2012/06/05(Tue) 11:42

データ行列をX(行が個体,列が変量,正規化あり),PCAで求めた固有ベクトル行列をA(各列が主成分に対応する固有ベクトル)としたとき,主成分スコア行列を

S = X・A

で求めました(行が個体,列が合成変量)。
このとき,任意の主成分スコアSに対応するXを復元することは可能でしょうか?

たとえば,下式を用いて簡単な数値例でためしたところ
元のXに近い値が出ているようですが完全には一致しません。
このような式は数学的に妥当なのでしょうか?

X = S・A^T (A^TはAの転置)

アドバイスお願いいたします。

No.16992 Re: 主成分スコアから元のデータを復元できますか?  【青木繁伸】 2012/06/05(Tue) 17:24

> X = S・A^T (A^TはAの転置)

?? X = S A^(-1) じゃないの?
A^(-1) は A の逆行列
> set.seed(123)
> x <- scale(matrix(rnorm(125), 25))
> r <- cor(x)
> a <- eigen(r)$vector
> ans <- prcomp(x)
> s <- x%*%a
> head(s) # 主成分得点
[,1] [,2] [,3] [,4] [,5]
[1,] 1.72145473 -0.81850783 0.2369613 0.9945320 -0.76999514
[2,] -0.66728474 0.78401078 -0.5597459 -0.1593928 0.47047908
[3,] -1.54891079 1.12725852 0.6379390 -0.3320514 -1.38761001
[4,] 0.08704549 -0.36832945 0.1809016 1.6821060 -0.89601986
[5,] -1.00307381 -0.42290639 -0.4290171 -1.1367236 -0.05527748
[6,] -1.89338636 -0.05002682 1.2496965 0.9678335 -0.21862967
> head(ans$x) # 主成分得点(主成分ごとに符号が違うのは問題ない)
PC1 PC2 PC3 PC4 PC5
[1,] -1.72145473 0.81850783 0.2369613 0.9945320 -0.76999514
[2,] 0.66728474 -0.78401078 -0.5597459 -0.1593928 0.47047908
[3,] 1.54891079 -1.12725852 0.6379390 -0.3320514 -1.38761001
[4,] -0.08704549 0.36832945 0.1809016 1.6821060 -0.89601986
[5,] 1.00307381 0.42290639 -0.4290171 -1.1367236 -0.05527748
[6,] 1.89338636 0.05002682 1.2496965 0.9678335 -0.21862967
> x2 <- s%*%solve(a) # "逆行列"を掛けると元のXになるか?
> head(x2)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5568050 -1.94676522 0.24997133 0.8947229 -0.55547913
[2,] -0.2079227 0.80059960 -0.03988784 -0.6832066 0.68371043
[3,] 1.6816142 0.05575928 -0.05461777 -1.8102804 0.03858287
[4,] 0.1096811 -1.34977722 1.39688536 -0.1219528 -0.09061636
[5,] 0.1717677 1.25335826 -0.24270549 -0.5075345 -0.86449433
[6,] 1.8467682 0.35296139 1.54894733 -0.3333389 0.29693357
> head(x) # 同じになる
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5568050 -1.94676522 0.24997133 0.8947229 -0.55547913
[2,] -0.2079227 0.80059960 -0.03988784 -0.6832066 0.68371043
[3,] 1.6816142 0.05575928 -0.05461777 -1.8102804 0.03858287
[4,] 0.1096811 -1.34977722 1.39688536 -0.1219528 -0.09061636
[5,] 0.1717677 1.25335826 -0.24270549 -0.5075345 -0.86449433
[6,] 1.8467682 0.35296139 1.54894733 -0.3333389 0.29693357
> 下式を用いて簡単な数値例でためしたところ
> 元のXに近い値が出ているようですが完全には一致しません。

同じにならないのは,全ての主成分を使わないからでしょ。
最初からいくつかの主成分だけを使うのでは,「近似」ですから,同じにはならない。

No.16996 Re: 主成分スコアから元のデータを復元できますか?  【K】 2012/06/05(Tue) 18:16

アドバイスありがとうございます。

>X = S A^(-1) じゃないの?

私もはじめは逆行列が正しいと思ったのですが,近似のため第二主成分まででAを切り詰める(Aの2列分だけ残してスコアを二次元にマッピングする)とAが正方行列ではなくなるため逆行列が計算できなくなってしまうのが悩みでした。

そのため,逆行列ではなく,転置行列を使うと切り詰めても行列の次元も合うし,うまく復元できているように見えたのですがなぜ転置でもできるのか理由がわからないので質問させていただきました。

いただいたサンプルで
x2 <- s%*%solve(a)
の部分を
x3 <- s%*%t(a)
としても元のxが復元されるようです(下の例)。

主成分分析の固有値ベクトルの行列Aは,逆行列と転置行列が等しくなるような性質があるのでしょうか?

> x2 <- s %*% solve(a)
> head(x2)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5568050 -1.94676522 0.24997133 0.8947229 -0.55547913
[2,] -0.2079227 0.80059960 -0.03988784 -0.6832066 0.68371043
[3,] 1.6816142 0.05575928 -0.05461777 -1.8102804 0.03858287
[4,] 0.1096811 -1.34977722 1.39688536 -0.1219528 -0.09061636
[5,] 0.1717677 1.25335826 -0.24270549 -0.5075345 -0.86449433
[6,] 1.8467682 0.35296139 1.54894733 -0.3333389 0.29693357
> head(x)
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5568050 -1.94676522 0.24997133 0.8947229 -0.55547913
[2,] -0.2079227 0.80059960 -0.03988784 -0.6832066 0.68371043
[3,] 1.6816142 0.05575928 -0.05461777 -1.8102804 0.03858287
[4,] 0.1096811 -1.34977722 1.39688536 -0.1219528 -0.09061636
[5,] 0.1717677 1.25335826 -0.24270549 -0.5075345 -0.86449433
[6,] 1.8467682 0.35296139 1.54894733 -0.3333389 0.29693357
> x3 <- s %*% t(a)
> head(x3) # x2と一致
[,1] [,2] [,3] [,4] [,5]
[1,] -0.5568050 -1.94676522 0.24997133 0.8947229 -0.55547913
[2,] -0.2079227 0.80059960 -0.03988784 -0.6832066 0.68371043
[3,] 1.6816142 0.05575928 -0.05461777 -1.8102804 0.03858287
[4,] 0.1096811 -1.34977722 1.39688536 -0.1219528 -0.09061636
[5,] 0.1717677 1.25335826 -0.24270549 -0.5075345 -0.86449433
[6,] 1.8467682 0.35296139 1.54894733 -0.3333389 0.29693357

> 全ての主成分を使わないからでしょ。

こちらの例題では,第二主成分まででAを切り詰めていたので近似になっているのを忘れていました。
ご指摘のとおりです。

No.16999 Re: 主成分スコアから元のデータを復元できますか?  【青木繁伸】 2012/06/05(Tue) 22:10

> 主成分分析の固有値ベクトルの行列Aは,逆行列と転置行列が等しくなるような性質があるのでしょうか?

そうでしたね。

No.17002 Re: 主成分スコアから元のデータを復元できますか?  【K】 2012/06/06(Wed) 14:07

アドバイスありがとうございます。
とりあえず正しいのがわかってほっとしました。
線形代数をもっと勉強してみます。

● 「統計学関連なんでもあり」の過去ログ--- 045 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る