行列の固有値を計算するのにどれくらいの費用がかかりますか?
最高のアルゴリズムの複雑さは何ですか?
1000 x 1000のマトリックスがある場合、実際にはどのくらい時間がかかりますか?行列がスパースの場合に役立つと思いますか?
固有値の計算が終了しない場合はありますか?
R
では、次のおもちゃの例のように固有値を計算できます。
m<-matrix( c(13,2, 5,4), ncol=2, nrow=2 )
eigen(m, only.values=1)
$values
[1] 14 3
誰かがそれが使用するアルゴリズムを知っていますか?
固有値を計算する他の(オープンソース)パッケージはありますか?
固有値計算のアルゴリズムのほとんどは、big-Oh(n ^ 3)にスケーリングされます。ここで、nは(対称および正方)行列の行/列次元です。
現在までの最良のアルゴリズムの時間計算量を知るには、Scientific Computing/NumericalMethodsの最新の研究論文を参照する必要があります。
ただし、最悪の場合を想定した場合でも、1000x1000行列に対して少なくとも1000 ^ 3の操作が必要になります。
Rは、デフォルトでLAPACKルーチン(DSYEVR、DGEEV、ZHEEV、およびZGEEV)の実装を使用します。ただし、EISPACK = TRUEをパラメーターとして指定して、EISPACKのRS、RG、CH、およびCGルーチンを使用することもできます。
固有値計算のための最も人気があり、優れたオープンソースパッケージはLAPACKとEISPACKです。
大きな行列では、通常、すべての固有値が必要になるわけではありません。上位の少数の人に(たとえば)次元削減を実行させたいだけです。
正規アルゴリズムは、ARPACKに実装されているArnoldi-Lanczos反復アルゴリズムです:
www.caam.rice.edu/software/ARPACK/
Eigsにはmatlabインターフェースがあります:
eigs(A,k) and eigs(A,B,k) return the k largest magnitude eigenvalues.
そして今、Rインターフェースもあります:
1000x1000のマトリックスがある場合、実際にはどのくらい時間がかかりますか?
MATLAB(LAPACKに基づく)は、デュアルコア1.83 GHzマシンで、1000x1000のランダムなすべての固有値を約5秒で計算します。行列が対称の場合、計算は大幅に高速化され、約1秒しかかかりません。
固有値アルゴリズム を見てみましょう。これは、さまざまな方法にリンクしています。それらはすべて異なる特性を持ち、うまくいけば、1つがあなたの目的に適しているでしょう。
[〜#〜] cran [〜#〜] のGuessCompx
パッケージを使用して、固有値計算の経験的複雑さを推定し、完全な値を予測できます。実行時間(あなたの例ではまだ小さいですが)。フィッティングプロセスは行をサブセット化するだけなので、少しヘルパー関数が必要です。したがって、行列を正方行列にする必要があります。
_library(GuessCompx)
m = matrix(rnorm(1e6), ncol=1000, nrow=1000)
# custom function to subset the increasing-size matrix to a square one:
eigen. = function(m) eigen(as.matrix(m[, 1:nrow(m)]))
CompEst(m, eigen.)
#### $`TIME COMPLEXITY RESULTS`
#### $`TIME COMPLEXITY RESULTS`$best.model
#### [1] "CUBIC"
#### $`TIME COMPLEXITY RESULTS`$computation.time.on.full.dataset
#### [1] "5.23S"
#### $`TIME COMPLEXITY RESULTS`$p.value.model.significance
#### [1] 1.784406e-34
_
時間の立方体の複雑さ、およびメモリのNlog(N)の複雑さ Rベースのeigen()
関数の使用法が得られます。計算全体を実行するには、5.2秒と37Mbかかります。
QRアルゴを使用しています。 Wilkinson、J。H.(1965)代数的固有値問題を参照してください。クラレンドンプレス、オックスフォード。スパース性を利用しません。