Determinar rapidamente se uma matriz densa é ou não de classificação baixa


13

Em um projeto de software em que estou trabalhando, certos cálculos são muito mais fáceis para matrizes densas de baixa patente. Algumas instâncias de problemas envolvem matrizes densas de baixo escalão, mas são dadas a mim na íntegra, e não como fatores, portanto, terei que verificar o rank e fatorar a matriz se quiser tirar proveito da estrutura de baixo escalão .

As matrizes em questão são tipicamente total ou quase totalmente densas, com n variando de cem a alguns milhares. Se uma matriz tem uma classificação baixa (digamos menos de 5 a 10), vale a pena computar o SVD e usá-lo em uma fatoração de classificação baixa. No entanto, se a matriz não tiver uma classificação baixa, o esforço será desperdiçado.

Assim, eu gostaria de encontrar uma maneira rápida e razoavelmente confiável de determinar se a classificação é baixa ou não antes de investir no esforço de fazer uma fatoração completa de SVD. Se, a qualquer momento, ficar claro que a classificação está acima do ponto de corte, o processo poderá parar imediatamente. Se o procedimento declarar erroneamente que a matriz é de classificação baixa quando não é, isso não é um problema enorme, pois eu ainda estaria fazendo um SVD completo para confirmar a classificação baixa e encontrar uma fatoração de classificação baixa.

As opções que considerei incluem uma classificação que revela a fatoração LU ou QR seguida por um SVD completo como verificação. Existem outras abordagens que devo considerar?

Respostas:


8

Há um truque interessante que aprendi recentemente neste artigo . Você começa a QR que revela a classificação e para após as primeiras reflexões de Household, quando você tem uma matriz da forma [ R 1 R 12 0 R 22 ] , com R 1 triangular de tamanho k × k e R 22 normalmente não triangular (desde que paramos após as primeiras k iterações do loop principal). Neste ponto, você verificar se R 22£ : se detiver, em seguida, Ak

[R1R120R22],
R1k×kR22kR22εAestá à distância no máximo de uma matriz de posição k ; caso contrário, não deveria ser (exceto erros numéricos).εk

Este procedimento custa para uma matriz n × n densa .O(n2k)n×n


Essa é essencialmente a abordagem que descrevi na pergunta. Penso que a resposta proposta por Wolfgang Bangerth poderia fazer melhor que . O(n2k)
22717 Brian Borchers

7

O problema, é claro, é que calcular a verdadeira classificação (por exemplo, por meio de uma decomposição QR) não é realmente mais barato do que calcular uma representação de baixo nível da matriz.

O melhor que você provavelmente pode fazer é usar um algoritmo aleatório para encontrar aproximações de classificação baixa. Estes podem, pelo menos em teoria, ser significativamente mais rápidos do que trabalhar em toda a matriz, porque, em essência, eles apenas calculam decomposições para projeções da matriz em subespaços aleatórios.

Se vale a pena para uma matriz de tamanho pode ser uma boa pergunta, mas se seus problemas realmente se tornarem grandes, eu suspeitaria que vale a pena.100×100


Pelo que sei desses algoritmos, eles produzem uma matriz de baixo escalão, razoavelmente próxima da norma da matriz fornecida. Eu preciso saber se há ou não uma (por exemplo) rank-10 ou menos matriz que é muito próximo da matriz dada (dizem que um erro relativo de 1.0E-10 ou melhor.)
Brian Borchers

Sim, mas você também pode fazer uma decomposição QR da matriz projetada (de baixa dimensão) e se essa decomposição revelar uma falta de classificação completa, você também terá uma matriz original com deficiência de classificação. Não era esse o critério necessário para decompor o QR na matriz original?
Wolfgang Bangerth

kkk1kAkknO(k2n)AO(kn2)

k=nkkn2n3

1

Outra abordagem que vale a pena tentar é usar a Aproximação Cruzada Adaptativa (ACA). É um algoritmo bastante popular que tem muitas implementações disponíveis online. Para referência, você pode ver o artigo original:

O ACA e suas variações (digamos, ACA +, HCA de aproximação cruzada híbrida) podem ser usados ​​em diferentes cenários. Você, já tendo toda a matriz densa calculada, é um dos favoráveis, pois poderá calcular os resíduos exatamente se necessário.

O(Nr)Nr(ϵ)rϵO(N2r)


0

A0xAxAATA

(ATA)A

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.