搁での対称行列の固有値?固有ベクトルの最适な求め方
- 1. 2009.08 作成
[R] 対称行列の固有値?固有ベクトルの最適な求め方
固有値算出には、固有値分解、特異値分解、QR 分解などいくつかの方法があり、R では
いずれも LAPACK のルーチンを呼び出して使っている。
対称行列についての計算の場合は、計算効率が良く DC 法よりもメモリを消費しない HG
法を採用している eigen 関数の利用が最も良いと思われる。
LAPACK にある固有値?特異値問題の解き方の流れ
Phase 1. 初期行列を減じる (二重対角化)
Phase 2. 固有値計算
Phase 3. 結果がもとの行列に対応するよう逆変換
※ Phase 1 と 3 は並立処理可能。問題は Phase 2。
固有値計算(Phase 2)の解法
1) QR 法 [LAPACK V.1~]
計算効率が O(n**3)
2) Divide-and-conquer(分割統治:DC)法 [LAPACK V.2~]
計算効率が最大で O(n**3)
3) Holy Grail(HG)法 [LAPACK V.3~]
計算効率が O(nk)
Rの固有値?特異値分解で使っている LAPACK ルーチン
○ 固有値分解 eigen()
- DSYEVR 対称行列の固有値問題に対する倍精度実数の RRR ドライバ ← HG 法
※ RRR: relatively robust representation の略
- DGEEV 非対称行列の固有値問題に対する倍精度実数の simple ドライバ
- ZHEEV 倍精度複素数用
- ZGEEV 倍精度複素数用
○ 特異値分解 svd()
- DGESDD 特異値分解の DC 法ドライバ
- ZGESVD 倍精度複素数用
[参考] “LAPACK Users’ Guide” Third Edition
http://www.netlib.org/lapack/lug/index.html