고밀도 매트릭스가 낮은 순위인지 여부를 신속하게 결정


13

내가 작업중 인 소프트웨어 프로젝트에서 밀도가 낮은 하위 행렬의 경우 특정 계산이 훨씬 쉽습니다. 일부 문제 인스턴스에는 밀도가 낮은 하위 행렬이 포함되어 있지만 요인이 아닌 전체가 제공되므로 하위 순위 구조를 활용하려면 순위를 확인하고 행렬을 인수 분해해야합니다. .

문제의 행렬은 일반적으로 완전히 또는 거의 완전히 밀도가 높으며 n은 100에서 수천까지입니다. 행렬의 순위가 낮은 경우 (예 : 5-10 미만) SVD를 계산하고이를 사용하여 낮은 순위 인수 분해를 사용하는 것이 좋습니다. 그러나 매트릭스의 순위가 낮지 않으면 노력이 낭비됩니다.

따라서 나는 완전한 SVD 인수 분해를하기위한 노력에 투자하기 전에 순위가 낮은 지 아닌지를 결정하는 빠르고 합리적인 방법을 찾고 싶다. 어느 시점에서 랭크가 컷오프보다 높으면 프로세스가 즉시 중지 될 수 있습니다. 프로 시저가 행렬이 아닌 경우 행렬이 실수로 낮은 순위임을 선언하는 경우 여전히 낮은 순위를 확인하고 낮은 순위 인수 분해를 찾기 위해 전체 SVD를 수행하고 있기 때문에 큰 문제는 아닙니다.

내가 고려한 옵션에는 LU 또는 QR 인수 분해를 나타내는 순위와 전체 SVD가 확인으로 포함됩니다. 고려해야 할 다른 접근 방법이 있습니까?

답변:


8

최근 이 논문 에서 배운 깔끔한 요령 있습니다. 당신은 최초의 후 순위 계시 QR 및 정지를하고 시작 양식의 행렬이있을 때, 세대주 반사 크기 는 삼각형의 크기 이며 일반적으로 삼각형이 아닙니다 ( 주 루프 의 첫 번째 반복 후에 중지 ). 이때 : 그것이 유지된다면, 는 랭크 의 행렬로부터 최대 거리에있다k

[R1R120R22],
R1k×kR22kR22εAεk; 그렇지 않으면 (숫자 오류 제외)해서는 안됩니다.

이 절차 는 조밀 한 행렬에 대해 든다 .O(n2k)n×n


이것은 본질적으로 질문에서 설명한 접근법입니다. Wolfgang Bangerth의 제안 된 답변은 보다 낫습니다 . O(n2k)
Brian Borchers

7

물론 문제는 (예를 들어 QR 분해를 통해) 실제 순위를 계산하는 것이 매트릭스의 하위 순위 표현을 계산하는 것보다 실제로 저렴하지 않다는 것입니다.

아마도 최선의 방법은 무작위 알고리즘을 사용하여 순위가 낮은 근사치를 찾는 것입니다. 이론 상으로는 이론 상으로는 임의의 서브 스페이스로 매트릭스 를 투영 하기위한 분해 만 계산하기 때문에 전체 매트릭스에서 작업하는 것보다 훨씬 빠릅니다 .

크기의 행렬에 가치가 있는지 여부 는 좋은 질문 일 수 있지만 문제가 실제로 커지면 그 가치가 있다고 생각합니다.100×100


내가이 알고리즘에 대해 알고있는 것으로부터, 그들은 주어진 행렬과 거의 비슷한 표준의 낮은 순위 행렬을 생성합니다. 주어진 행렬과 매우 가까운 (예를 들어) rank-10 이하의 행렬이 있는지 (예 : 1.0e-10 이상의 상대 오차) 있는지 알아야합니다.
Brian Borchers

예, 그러나 투영 된 (낮은 차원의) 행렬의 QR 분해를 수행 할 수 있으며이 분해로 인해 전체 순위가 부족한 경우 순위가 부족한 원본 행렬도 있습니다. 원래 매트릭스에서 QR 분해를 수행하는 데 필요한 기준이 아니 었습니까?
Wolfgang Bangerth 's

투영 된 행렬의 순위가 보다 작거나 같습니다 (임의 행렬의 행 수에 A를 곱한 횟수)와 A의 순위입니다. 순위 인 경우 원래 행렬을 사용할 수 없습니다. 이하 의 등급 . 그것이 보다 작은 순위라면, 나는 운이 좋지 않았거나 가 보다 낮은 순위를 가질 수 있습니다 . 행렬에 의해 의 순위를 찾는 것은 시간 내에 수행 될 수있다 . 그러나 곱한 랜덤 행렬 이 밀도가 높으면, 뮤팅에 가 걸립니다.kkk1kAkknO(k2n)AO(kn2)시각. 확률이 높은 순위를 유지하는 희소 행렬이 있습니까?
Brian Borchers

모르겠어요 알고리즘이 행렬의 전체 순위가 아닌 경우에만 알 수 있음에 동의합니다. 모든 임의의 방향 을 취하지 않으면 행렬 전체 순위 인지 알 수 없습니다 . 내 희망은 단순히 당신이 충분히 작은에 대한 답을 얻을 것입니다 곳 . k=nkkn2n3
Wolfgang Bangerth

1

시도 할 가치가있는 또 다른 방법은 ACA (Adaptive Cross Approximation)를 사용하는 것입니다. 온라인에서 많은 구현을 사용할 수있는 매우 인기있는 알고리즘입니다. 참고로 원본 용지를 볼 수 있습니다.

ACA와 그 변형 (예 : ACA +, 하이브리드 교차 근사 HCA)은 다른 시나리오에서 사용될 수 있습니다. 필요한 경우 정확하게 잔차를 계산할 수 있기 때문에 이미 전체 밀도 매트릭스를 계산하는 것이 유리합니다.

경험적 잔차 (알고리즘 참조)로 충분하면 복잡도가 일 것입니다. 여기서 은 정사각형 행렬의 크기이고 은 순위입니다. 순위 은 규정 된 절단 공차 의 함수입니다 . 정확하고 보장 된 오류 범위에는 이 필요합니다 .O(Nr)Nr(ϵ)rϵO(N2r)


0

행렬 가 양의 양의 대칭 인 간단한 경우, 20 개의 가장 큰 고유 값을 계산하고 값 인지 확인하거나 규범을 비교하십시오. ARPACK이 빠릅니다. 더 중요한 것은 함수 만 필요합니다 . 따라서 일반 의 경우 의 고유 값을 살펴보십시오 (인스턴스화하지 않고 LinOp로).A0xAxAATA

scipy.sparse.linalg.svds 는 다음을 수행합니다. LinOp Arpack, 모든 크기의 :(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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.