Numpy가 SVD를 수행하는 방법 이해


13

행렬의 순위와 방정식의 행렬 시스템의 솔루션을 모두 계산하기 위해 다른 방법을 사용했습니다. linalg.svd 기능을 발견했습니다. 이것을 가우시안 제거 (Gaussian Elimination)로 시스템을 해결하려는 나의 노력과 비교하면 더 빠르고 정확한 것으로 보입니다. 이것이 어떻게 가능한지 이해하려고합니다.

내가 아는 한 linalg.svd 함수는 QR 알고리즘을 사용하여 행렬의 고유 값을 계산합니다. 나는 이것이 수학적으로 어떻게 작동하는지는 알고 있지만 Numpy가 얼마나 빨리 정밀도를 잃지 않고 그렇게하는지 잘 모르겠습니다.

내 질문 : numpy.svd 기능은 어떻게 작동합니까? 더 구체적으로, 가우시안 제거와 비교하여 어떻게 빠르고 정확하게 수행합니까?


2
numpy는 dgesdd실제 가치 SVD에 Lapack 루틴 을 사용합니다 . 따라서 귀하의 실제 질문은 아마도 "Lapack dgesdd는 어떻게 작동합니까?"일 것입니다.
talonmies

정말로 궁금한 점이 있다면 LAPACK 소스를 살펴 보는 것이 좋습니다.

귀하의 의견과 사과에 감사드립니다.
RobVerheyen

이 게시물은 Stack Overflow 의 크로스 게시물입니다 . 교차 게시는 일반적으로 Stack Exchange 사이트에서 권장하지 않습니다. 다른 사이트에 질문을 다시 게시하기위한 표준 프로토콜은 다른 사이트에 다시 게시하기 전에 원래 게시물을 닫거나 삭제하거나 마이그레이션하는 것입니다. (질문을 이전하면 자동으로 다시 게시됩니다.)
Geoff Oxberry

죄송합니다. 프로토콜에 대해 알지 못했습니다. 여전히 답을 얻을 수 있기를 바랍니다.
RobVerheyen

답변:


15

귀하의 질문에 여러 가지 문제가 있습니다.

행렬의 숫자 순위를 계산하기 위해 가우시안 제거 (LU 가산)를 사용하지 마십시오. 부동 소수점 산술에서는 LU 인수 분해를 신뢰할 수 없습니다. 대신 순위를 밝히는 QR 분해 (예 : x가 C, D, S 또는 Z 인 LAPACK 과 같은 xGEQPX또는 xGEPQYLAPACK에서 이러한 루틴을 추적하기는 어렵습니다. 관련 질문에 대한 JedBrown의 답변 참조 )를 사용하거나 SVD를 사용하십시오. ( xGESDD또는 과 같은 특이 값 분해, xGESVD여기서 x는 다시 C, D, S 또는 Z 임). SVD는 숫자 순위를 결정하는 데보다 정확하고 안정적인 알고리즘이지만 더 많은 부동 소수점 연산이 필요합니다.

그러나 선형 시스템을 해결하기 위해 LU 인수 분해 (LAPACK의 표준 구현 인 부분 피벗 사용)는 실제로 매우 안정적입니다. 부분 피벗을 사용한 LU 분해가 불안정한 병리학 적 사례가 있습니다 ( 숫자 선형 대수의 강의 22 참조)자세한 내용은 Trefethen 및 Bau)가 제공합니다. QR 인수 분해는 선형 시스템을 해결하기위한보다 안정적인 수치 알고리즘이므로 정확한 결과를 얻을 수 있습니다. 그러나 평방 행렬의 경우 2 배로 LU 인수 분해보다 더 많은 부동 소수점 연산이 필요합니다 (JackPoulson이 저를 수정할 수 있다고 생각합니다). 사각형 시스템의 경우 QR 인수 분해는 과도하게 결정된 선형 시스템에 대해 최소 제곱 솔루션을 생성하므로 더 나은 선택입니다. SVD를 사용하여 선형 시스템을 해결할 수도 있지만 QR 인수 분해보다 비쌉니다.

janneb은 numpy.linalg.svd가 xGESDDLAPACK에서 래퍼 (wrapper)라는 것이 맞습니다 . 특이 값 분해는 두 단계로 진행됩니다. 먼저, 분해 될 매트릭스는 2 각형으로 축소된다. LAPACK에서 이진 형태로 축소하는 데 사용되는 알고리즘은 Lawson-Hanson-Chan 알고리즘 일 수 있으며 한 시점에서 QR 인수 분해를 사용합니다. Trefethen과 Bau의 Numerical Linear Algebra 강의 31 은이 과정에 대한 개요를 제공합니다. 그런 다음 xGESDD나누기 및 정복 알고리즘을 사용하여 2 각형 행렬에서 특이 값과 왼쪽 및 오른쪽 특이 벡터를 계산합니다. 이 단계에 대한 배경 지식을 얻으려면 Golub and Van Loan의 Matrix Computations 또는 Jim Demmel의 Applied Numerical Linear Algebra 를 참조하십시오 .

마지막으로 특이 값과 고유 값을 혼동해서는 안됩니다 . 이 두 세트의 수량은 동일하지 않습니다. SVD는 행렬의 특이 값을 계산합니다. MATLAB사용한 Cleve Moler의 Numerical Computing 은 특이 값과 고유 값의 차이점에 대한 훌륭한 개요를 제공합니다 . 일반적으로 정규 행렬 의 경우를 제외하고 주어진 행렬의 특이 값과 고유 값 사이에는 명백한 관계가 없습니다 . 단수 값은 고유 값의 절대 값입니다.


고유 값과 특이 값의 관계에 대해 "관련되지 않음"이 매우 강력하다고 생각합니다. 요르단 분해에 대한 정보가 있거나 추정 할 의사가있는 경우 행렬의 전체 요르단 분해를 알지 않는 한 관계가 명확하지 않습니다.
Dan

대신 무엇을 제안 하시겠습니까?
Geoff Oxberry

우선, 정교한 답변에 감사드립니다. 매트릭스 순위를 결정하기 위해 LU 분해를 사용할 수 없다는 것을 알았습니다. 귀하의 답변은 QR 인수 분해가 실제로 내 문제를 해결하는 가장 빠른 방법이라는 것을 암시하는 것 같습니다. 맞습니까? SVD를 사용할 때 뚜렷한 이점이 있습니까? 특이 값이 고유 값이 아니라는 사실을 잘 알고있었습니다. 저는 단일 값을 왼쪽에서 조옮김과 곱한 행렬의 고유 값으로 계산할 수 있다는 사실을 언급했습니다. 명확하지 않은 것이 유감입니다.
RobVerheyen

내가 풀고있는 행렬이 실제로 단수라고 덧붙일 수 있습니다. 실제로, 행렬 순위는 행렬 크기의 절반에 불과합니다. 아마도 이것이 어떤 방법을 선호 하는가?
RobVerheyen

1
@RobVerheyen : QR은 LU보다 느리지 만 상당히 정확합니다. SVD는 QR보다 훨씬 느리지 만 SVD는 숫자 순위를 결정하는 가장 신뢰할 수있는 방법으로 간주됩니다 (예 : MATLAB은 해당 rank기능 에서 SVD를 사용합니다 ). 두 가지 방법 중 하나를 사용할 때 약간의 재량도 있습니다. SVD 접근에서 숫자 순위는 지정된 (보통 매우 작은) 컷오프를 초과하는 특이 값의 수입니다. (QR 접근 방식은 비슷하지만 특이 값을 R 행렬의 대각선 항목으로 대체합니다.)
Geoff Oxberry

8

귀하의 질문의 말로 인해, 나는 행렬이 정사각형이라고 가정합니다. zgesvd 와 같은 LAPACK의 SVD 루틴은 기본적으로 정방 행렬에 대해 3 단계로 진행됩니다.

  1. UAVAAB:=UAHAVAUAVABO(n3)
  2. {UB,VB,Σ}B=UBΣVBHO(n2)O(n3)
  3. UABVAH=AA=(UAUB)Σ(VAVB)HUAVAUBVBO(n3)

7

numpy.linalg.svd는 LAPACK의 {Z, D} GESDD를 감싸는 래퍼입니다. LAPACK은 숫자 선형 대수학 분야의 세계 최고의 전문가들에 의해 매우 신중하게 작성되었습니다. 실제로,이 분야에 친숙하지 않은 사람이 LAPACK을 꺾는 데 성공한다면 (속도 나 정확성 중) 놀라운 것은 놀라운 일입니다.

QR이 가우시안 제거보다 나은 이유는 /scicomp//에 더 적합합니다.


답변과 참조에 감사드립니다. 저기서해볼 게요
RobVerheyen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.