EDIT: Estou testando se algum autovalor tem uma magnitude de um ou mais.
Preciso encontrar o maior autovalor absoluto de uma grande matriz esparsa e não simétrica.
Eu tenho usado a eigen()
função de R , que usa o QR algo do EISPACK ou LAPACK para encontrar todos os autovalores e, em seguida, utilizo abs()
para obter os valores absolutos. No entanto, eu preciso fazer isso mais rápido.
Eu também tentei usar a interface ARPACK no igraph
pacote R. No entanto, deu um erro para uma das minhas matrizes.
A implementação final deve ser acessível a partir de R.
Provavelmente haverá vários autovalores da mesma magnitude.
Você tem alguma sugestão?
EDIT:
Precisão só precisa ser 1e-11
. Até agora, uma matriz "típica" foi . Consegui fazer uma fatoração de QR nele. No entanto, também é possível ter muito maiores. Atualmente, estou começando a ler sobre o algoritmo de Arnoldi. Eu entendo que isso está relacionado ao Lanczsos.
EDIT2: Se eu tiver várias matrizes que estou "testando" e sei que existe uma submatriz grande que não varia. É possível ignorá-lo / descartá-lo?
Respostas:
Depende muito do tamanho da sua matriz, no caso em larga escala, também se é escassa e na precisão que você deseja obter.
Se sua matriz é muito grande para permitir uma única fatoração e você precisa de alta precisão, o algoritmo de Lanczsos é provavelmente o caminho mais rápido. No caso não simétrico, é necessário o algoritmo de Arnoldi, que é numericamente instável; portanto, uma implementação precisa abordar isso (é um pouco difícil de curar).
Se esse não for o seu problema, forneça informações mais específicas em sua pergunta. Em seguida, adicione um comentário a esta resposta e eu a atualizarei.
Edit: [Isso era para a versão antiga da pergunta, buscando o maior valor próprio.] Como sua matriz é pequena e aparentemente densa, eu faria a iteração de Arnoldi em B = (IA) ^ {- 1}, usando uma inicial permitiu que a fatoração triangular de IA tivesse multiplicação barata por B. (Ou calcule uma inversa explícita, mas isso custa três vezes mais que a fatoração.) Você deseja testar se B tem um valor próprio negativo. Trabalhando com B no lugar de A, os autovalores negativos são muito melhores separados; portanto, se houver um, você deverá convergir rapidamente.
Mas estou curioso para saber de onde vem o seu problema. Matrizes não simétricas geralmente têm autovalores complexos, portanto '' maior '' nem é bem definido. Portanto, você deve saber mais sobre o seu problema, o que pode ajudar a sugerir como resolvê-lo ainda mais rápido e / ou com mais confiabilidade.
Edit2: É difícil conseguir com Arnoldi um subconjunto particular de interesse. Para obter os valores autônomos absolutamente maiores, faça a iteração do subespaço usando a matriz original, com um tamanho de subespaço correspondendo ou excedendo o número de valores próprios que se espera que sejam próximos a 1 ou maior em magnitude. Em matrizes pequenas, isso será mais lento que o algoritmo QR, mas em matrizes grandes será muito mais rápido.
fonte
A Iteração de Potência (ou Método de Potência), por exemplo, o que Dan está descrevendo, deve sempre convergir, embora à taxa .|λn−1/λn|
Se estiver próximo de λ n , será lento, mas você pode usar a extrapolação para contornar isso. Pode parecer complicado, mas uma implementação em pseudo-código é apresentada no artigo.λn−1 λn
fonte
Houve algumas boas pesquisas sobre isso recentemente. As novas abordagens usam "algoritmos aleatórios", que exigem apenas algumas leituras de sua matriz para obter boa precisão nos maiores valores próprios. Isso contrasta com as iterações de potência que requerem várias multiplicações de vetores matriciais para alcançar alta precisão.
Você pode ler mais sobre a nova pesquisa aqui:
http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf
http://arxiv.org/abs/0909.4061
Este código fará isso por você:
http://cims.nyu.edu/~tygert/software.html
https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m
http://code.google.com/p/redsvd/
https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html
Se o seu idioma de escolha não estiver lá, você poderá rolar seu próprio SVD aleatório com bastante facilidade; requer apenas uma multiplicação de vetores de matriz seguida de uma chamada para um SVD pronto para uso.
fonte
Aqui você encontrará uma introdução algorítmica ao algoritmo Jacobi-Davidson, que calcula o valor próprio máximo.
Neste artigo, os aspectos matemáticos são explorados. O JD permite matrizes gerais (reais ou complexas) e pode ser usado para calcular intervalos de valores próprios.
Aqui você pode encontrar várias implementações de bibliotecas JDQR e JDQZ (incluindo uma interface C, à qual você deve poder vincular a partir do R).
fonte
Na sua postagem original, você diz:
"Eu também tentei usar a interface ARPACK no pacote igraph R. No entanto, ocorreu um erro para uma das minhas matrizes."
Eu estaria interessado em saber mais sobre o erro. Se você puder disponibilizar essa matriz publicamente em algum lugar, eu estaria interessado em experimentar o ARPACK nela.
Com base no que li acima, eu esperaria que o ARPACK fizesse um trabalho muito bom ao extrair os maiores (ou alguns dos maiores) autovalores de uma matriz esparsa. Para ser mais específico, eu esperaria que os métodos da Arnoldi funcionassem bem nesse caso e, é claro, é nisso que o ARPACK se baseia.
A lenta convergência do método de potência quando existem autovalores próximos na região de interesse foi mencionada acima. Arnoldi aprimora isso iterando com vários vetores em vez do método power.
fonte
Não é a maneira mais rápida, mas uma maneira razoavelmente rápida é simplesmente atingir um vetor (inicialmente aleatório) com a matriz repetidamente e normalizar a cada poucos passos. Eventualmente, convergirá para o maior vetor próprio, e o ganho na norma para uma única etapa é o valor próprio associado.
Isso funciona melhor quando o maior autovalor é substancialmente maior que qualquer outro autovalor. Se outro autovalor está perto em magnitude ao maior, isso vai levar um tempo para convergir, e isso pode ser difícil determinar se ele tem convergido.
fonte
O pacote RARPACK funciona para mim. E parece ser muito rápido, pois é apenas uma interface para o ARPACK, o pacote padrão para álgebra linear esparsa (o que significa calcular alguns autovalores e autovetores).
fonte