ブログ「色々と考えてみる」の「文系のための「多次元データ解析」」を読み解く(4)

続きまして、本当に参考にしているブログ「色々と考えてみる」の「文系のための「多次元データ解析」」をより「疑逆行列」を読み解いていきます。

文系のための「擬逆行列」(1)

これまで出てきた「逆行列」のおさらい。

逆行列の使用法のポイントは、
スカラーの「逆数」に対応し、元の行列にこの逆行列を掛けると、「単位行列」が出てくるというもの。

さらに、

「逆行列」が「正方行列」でないといけない、というルールを記憶する必要がある。

この「正方行列でないといけない」というルールを回避し、近似的に「逆行列」を求める方法が、「疑逆行列」。

通常の4✕3の行列を、
solve関数を使って逆行列化しようとすると、
以下にエラー solve.default(A) : 逆行列は正方行列だけにしか定義できません
と表記エラーが表示される。

そこで、逆行列化するために以下を実行する。

t(A) %*% A

Aというのが4✕3行列。
この行列をt(A)で転置させ、元の行列Aをかけると正方行列ができる。

できた逆行列を擬似的に算出するための計算式が以下。

solve(t(A)%*%A)%*%t(A)

solve関数で、Aの転置行列とAをかけたものを逆行列化。
これにAの転置行列をかけると「疑逆行列」ができる。と。

これらに元の行列をかけると単位行列が出てくる、と。

solve(t(A)%*%A)%*%t(A) %*% A
「solve(t(A)%*%A)%*%t(A) 」までが疑逆行列。
掛けあわせた A が元の行列。

> solve(t(A)%*%A)%*%t(A) %*% A
[,1] [,2] [,3]
[1,] 1.000000e+00 -1.865175e-14 -3.677059e-13
[2,] 8.384404e-13 1.000000e+00 7.389644e-13
[3,] 1.030287e-13 -5.129230e-14 1.000000e+00

対角成分が「1」でそれ以外は、「0(限りなく)」。
ちゃんと逆行列の状態になっている、ということ。

と、ここまで書いておいて、オチのlibraryの登場。

MASSライブラリーを呼び出し、
library(MASS)

擬逆行列を計算する関数、ginv()をポンとする。

ginv(A)

なんだ。

しかし、話は特異値分解の話にいく。
どうやらこの特異値分解は数学の魔法がつまった分解とのこと。

ある行列Xを特異値分解すると以下のようになる。

X = UDV’

Uは、「左特異ベクトル」と呼ばれる行列。
Dは、「特異値行列」と呼ばれる対角行列。
V’は、「右特異ベクトル」と呼ばれる行列。

この分解は、無秩序な任意の行列を、ある「規則的な行列同士」の「掛け算」に分解していると暗記。

svd()関数で特異値分解。

分解したデータをstr()で確認。

> str(A.svd)
List of 3
$ d: num [1:3] 110.209 38.706 0.167
$ u: num [1:4, 1:3] -0.82 -0.0249 -0.409 -0.3995 -0.0647 …
$ v: num [1:3, 1:3] -0.5758 -0.0739 -0.8142 0.8161 -0.1118 …

良い感じに構造が丸見え。

各成分を「D」「V」「U」の変数に格納。

D <- diag(A.svd$d) V <- A.svd$v U <- A.svd$u

Dについては、ベクトルとして出力されているため、diag()関数を使って対角行列に行列化。

公式に基いて、疑逆行列化。

V%*%solve(D)%*%t(U)

という手順。

特異値分解は、後に主成分分析や対応分析にも登場する

この回はかなり重要だ(って、回を追うごとに重要度が増していきます)。

私的まとめ。

◯solve()関数を使って逆行列化するときに、元の行列が正方行列でないとダメ。(おさらい)
◯よって、逆行列化するために一旦正方行列化する。t(A) %*% A。
◯さらに、「solve(t(A)%*%A)%*%t(A)」する(←これが疑逆行列化)。
 つまり、solve関数で、Aの転置行列とAをかけたものを逆行列化。これにAの転置行列をかけると「疑逆行列」ができる。と。
◯でも、これらはMASSライブラリーのginv()関数を使って一発で計算できる。
◯特異値分解はかなり重要。
◯特異値分解は、行列をある規則にそって意味ある行列に分解する分解(ややこしい?)。
◯特異値分解する方法は、svd()関数を使う。
◯svd()関数で分解した行列を公式にあてはめて計算する(V%*%solve(D)%*%t(U))と疑逆行列が算出できる。
◯特異値分解は、主成分分析や対応分析にも登場!

熱いぜ、逆行列、疑逆行列、特異値分解!

以後、続く。

Leave a Reply