Подтвердить что ты не робот

Насколько дорого стоит вычисление собственных значений матрицы?

Насколько дорого стоит вычисление собственных значений матрицы?

В чем сложность лучших алгоритмов?

Сколько времени может потребоваться на практике, если у меня есть матрица 1000 x 1000? Я предполагаю, что это помогает, если матрица разрежена?

Существуют ли случаи, когда вычисление собственных значений не заканчивается?

В R я могу вычислить собственные значения, как в следующем примере игрушек:

m<-matrix( c(13,2, 5,4), ncol=2, nrow=2 )
eigen(m, only.values=1)
$values
[1] 14  3

Кто-нибудь знает, какой алгоритм он использует?

Есть ли другие (с открытым исходным кодом) пакеты, которые вычисляют собственное значение?

4b9b3361

Ответ 1

Большинство алгоритмов вычисления собственных значений масштабируются до больших-Oh (n ^ 3), где n - размер строки /col (симметричной и квадратной) матрицы.

Для того, чтобы знать временную сложность наилучшего алгоритма до даты, вам нужно будет обратиться к последним исследованиям в области научных вычислений/числовых методов.

Но даже если вы предполагаете худший случай, вам все равно потребуется по крайней мере 1000 ^ 3 операций для матрицы 1000x1000.

R использует по умолчанию процедуру LAPACK (DSYEVR, DGEEV, ZHEEV и ZGEEV). Однако вы можете указать EISPACK = TRUE в качестве параметра для использования процедур EISPACK RS, RG, CH и CG.

Наиболее популярными и хорошими пакетами с открытым исходным кодом для вычисления собственных значений являются LAPACK и EISPACK.

Ответ 2

С большими матрицами вам обычно не нужны все собственные значения. Вы просто хотите, чтобы топ-немногие сделали (скажем) уменьшение размера.

Канонический алгоритм - это итеративный алгоритм Арнольди-Ланцоса, реализованный в ARPACK:

www.caam.rice.edu/software/ARPACK/

В интерфейсе есть интерфейс matlab:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/eigs.html

eigs(A,k) and eigs(A,B,k) return the k largest magnitude eigenvalues.

И теперь есть интерфейс R:

http://igraph.sourceforge.net/doc-0.5/R/arpack.html

Ответ 3

Я предполагаю, что это помогает, если матрица разреженным?

Да, есть алгоритмы, которые хорошо работают на разреженных матрицах.

См. например: http://www.cise.ufl.edu/research/sparse/

Ответ 4

Сколько времени может потребоваться на практике, если У меня матрица 1000x1000?

MATLAB (на основе LAPACK) вычисляет на двухъядерном компьютере 1,83 ГГц все собственные значения 1000x1000 случайным образом примерно через 5 секунд. Когда матрица симметрична, вычисление может быть выполнено значительно быстрее и требуется всего около 1 секунды.

Ответ 5

Я бы рассмотрел алгоритмы собственных значений, которые ссылаются на несколько разных методов. Все они будут иметь разные характеристики, и, надеюсь, он будет подходящим для ваших целей.

Ответ 6

Apache Mahout - это фреймворк с открытым исходным кодом, построенный на map-reduce (т.е. он работает для действительно больших матриц). Обратите внимание, что для многих матричных материалов вопрос заключается не в том, "какова большая-во время выполнения", а скорее "насколько это возможно?". Mahout говорит, они используют Lanczos, которые могут быть запущены параллельно на столько процессоров, сколько вам нужно.

Ответ 7

Вы можете использовать пакет GuessCompx от CRAN, чтобы оценить эмпирическую сложность вычисления собственных значений и предсказать полное время выполнения (хотя оно все еще мало в вашем примере). Вам нужна небольшая вспомогательная функция, потому что процесс подбора только поднаборов строк, поэтому вы должны сделать матрицу квадратной:

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 base eigen(). На выполнение всех вычислений уходит 5,2 секунды и 37 МБ.

enter image description here

Ответ 8

Он использует QR-алгоритм. См. Wilkinson, J. H. (1965) Алгебраическая задача на собственные значения. Clarendon Press, Оксфорд. Он не использует разреженность.