2012年12月20日木曜日

Rで固有値と特異値分解の計算をする方法


R Advent Calendarの20日目の記事です。

今年初めてAdvent Calendarに参加させていただきました。
大した内容を書けず恐縮ですが、生暖かい目で記事みてもらえると助かりますw

Rはベクトルでの表現であることは周知の通りです。

なので、Rにはそのようなベクトルを求める関数があります。

今回は個人的に学びたかった固有値と特異値分解を行う関数を紹介します。

■固有値を求める関数

固有値と固有ベクトルに関してはWikipediaに詳細な説明が載っているので、そちらに譲ります。

固有値

Rでベクトルを求める際に使われる関数はeigen関数です。
eigen関数を使って下記の行列の固有値、固有ベクトルを求めてみます。





#ベクトルの固有値、固有ベクトルを求める
eigen(A)

$values
[1] 4.5615528 0.4384472
$vectors
           [,1]       [,2]
[1,] -0.2703230 -0.8719282
[2,] -0.9627697  0.4896337
 

$valuesが固有値、$vectorsが固有ベクトルです。
これで固有値と固有ベクトルが求められました。

■特異値分解を求める関数

固有値を求める問題では、正方行列を対象としていました。
しかし、多くの場合、そういった形状でないケースが多くあります。

n行p列の行列Bが与えられたとき、下記のようにBを3つの行列の積に分解することを
特異値分解と言います。




Rで特異値分解をするときは関数svdを使います。
下記のような行列Dを特異値分解してみます。


#特異値分解を求める
svd(D)
$d
[1] 6.881910 1.624598

$u
           [,1]       [,2]
[1,] -0.7677517 -0.6407474
[2,] -0.6407474  0.7677517

$v
           [,1]       [,2]
[1,] -0.6324555 -0.6324555
[2,] -0.7071068  0.7071068
[3,] -0.3162278 -0.3162278
 
Rから返されてきた$uが分解式のU、$vがVの部分に相当し、$dが主対角行列のDλの対角要素です。

このように、Rはベクトル演算がとても簡単にできるので、その後の分析にも重宝されますね。

P.S
いまだにRのコンソールをたたいていたのですが、昨日R Studioの良さを力説されたため、ようやく使い始めました。

それでは、皆様よいお年を。

0 件のコメント:

ページビューの合計