Rでの行列の積、逆行列、転置行列の計算
概要
Rの強みは、行列をはじめとする様々なデータセットの操作が簡単である点と、豊富な統計パッケージを無料で提供していることだ。言うまでもないが、統計分析において行列の計算は非常に重要で、Rはこれらのニーズに素晴らしく応えてくれる。MATLABやJuliaではない限り、他の言語では行列の操作を面倒くさがらずに別途定義する必要があるだろう。
コード
行列の乗算
例として、行列$a = \begin{bmatrix} 2 & 1 & 0 \\ 1 & 2 & 1 \\ 0 & 1 & 2 \end{bmatrix}$の$2$行目と$3$行目を交換したいとしよう。線形代数では、順列行列$P = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix}$を$A$の左側に乗算すれば、希望の結果を得られる。つまり、$PA = \begin{bmatrix} 2 & 1 & 0 \\ 0 & 1 & 2 \\ 1 & 2 & 1 \end{bmatrix}$である。この計算をRで、行列を乗算する演算子%*%を通じて実装してみよう。
A = matrix(c(2,1,0,1,2,1,0,1,2),ncol=3); A
P = matrix(c(1,0,0,0,0,1,0,1,0),ncol=3); P
P%*%A
上記のコードを実行した結果は以下の通りだ。
逆行列と転置行列
理論的な計算とピッタリ合うことが確認できる。$PA = B$、つまりこのようにして得られた行列を$B$と定義し、続けて逆行列と転置行列を求めよう。
B=P%*%A; B
solve(B)
t(B)
逆行列を求める関数はsolve()
で、転置行列を求める関数はt()
だ。t()
がTransposeから来たのは容易に推測できる。一方で、逆行列がinverse()ではなくsolve()
で定義されているのは、連立方程式$A \mathbf{x} = \mathbf{b}$があるとき、解が$\mathbf{x} = A ^{-1} \mathbf{b}$で与えられるからだ。逆行列を求めることは、問題を解くという意味と同じだ。
上記のコードを実行した結果は以下の通りだ。
転置行列は単に行と列を反転させるだけなので、結果は一目で確認できる。逆行列は $$ B^{-1} = \begin{bmatrix} {{3}\over{4}} & {{1}\over{4}} & -{{1}\over{2}} \\ -{{1}\over{2}} & -{{1}\over{2}} & 1 \\ {{1}\over{4}} & {{3}\over{4}} & -{{1}\over{2}} \end{bmatrix} = {{1}\over {4}} \begin{bmatrix} 3 & 1 & -2 \\ -2 & -2 & 4 \\ 1 & 3 & -2 \end{bmatrix} $$で計算されたが、自分で求めるのは難しいので、検算だけしてみよう。 $$ B^{-1} B = {{1}\over {4}} \begin{bmatrix} 3 & 1 & -2 \\ -2 & -2 & 4 \\ 1 & 3 & -2 \end{bmatrix} \begin{bmatrix} 2 & 1 & 0 \\ 0 & 1 & 2 \\ 1 & 2 & 1 \end{bmatrix} = {{1}\over {4}} \begin{bmatrix} 4 & 0 & 0 \\ 0 & 4 & 0 \\ 0 & 0 & 4 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} $$