절단 된 SVD, 한 번에 하나의 특이 값 / 벡터 계산


11

한 번에 하나씩 특이 값을 계산하는 잘린 SVD 알고리즘이 있습니까?

내 문제 : 큰 밀도 행렬 M 의 첫 k 특이 값 (및 특이 벡터) 을 계산하고 싶지만 적절한 k 값이 무엇인지 모르겠습니다 . M 은 크므로 효율성 때문에 전체 SVD를 평가하지 않고 나중에 가장 작은 SV를 잘라 버릴 것입니다.MkM

이상적으로는, 특이 값을 계산하는 방법이 될 것이다 σ1,σ2, 직렬, 최대 행 ( σ1 작은 (행) σn ). 그런 식으로, σ k / σ 1 이 임계 값 아래로 떨어지면 k 번째 특이 값을 계산 한 후 계산을 간단히 중단 할 수 있습니다.σk/σ1

이러한 알고리즘이 존재합니까 (Python 구현에 선호)? 내 인터넷 검색에서 k를 매개 변수로 사용하는 잘린 SVD 함수 만 찾았으므로 우선 순위를 추측해야합니다.


당신의 M은 정사각형입니까, 직사각형입니까? 직사각형이면 길거나 짧은 특이 벡터를 원하십니까? 즉, M이 m> n 인 (mxn) 인 경우 (mxk) 또는 (kxn)을 원하십니까?
Max Hutchinson

M은 직사각형이며 열보다 많은 행이 있습니다. 짧은 특이 벡터 (즉 V, M = U S V ^ T)를 원합니다 .
SuperElectric

답변:


6

대략적인 순위 k 인수 분해를 원하는 경우 사용할 수있는 몇 가지 옵션이 있습니다.

  1. 강력한 계급을 자랑하는 QR 분해
  2. 보간 분해 (ID) 및 기타 무작위 기술.

일반적으로, 이들은 A M N Tfactor × σ k + 형식의 인수 분해를 제공합니다.

미디엄인자×σ케이+1(): =ϵ

위 양식의 근사 분해는 표준 기술을 사용하여 QR 또는 SVD와 같은 표준 분해로 변환 될 수 있습니다. Halko, Martinsson 및 Tropp의 논문에서 좋은 리뷰를 얻을 수 있습니다. "임의의 구조 찾기 : 근사 행렬 분해 구성을위한 확률 알고리즘"

소프트웨어 측면에서 ID 알고리즘에 대한 인터페이스는 scipy (scipy.linalg.interpolative)에서 사용할 수 있습니다. http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html 수 있습니다. .ϵ


2

(나는 처음에 질문을 오독했기 때문에 편집했습니다. 첫 번째를 계산할 수있는 루틴이 있음을 이미 알고 있습니다. 케이

전체 SVD 계산 방법을 제외하면 부분 SVD 알고리즘이 반복적 인 방법을 사용하여 관련 에르 미트 고유 값 문제를 해결하는 것으로 줄어 듭니다. 따라서 여러분이 취할 수있는 한 가지 전략은 이러한 종류의 일을 직접 코딩하는 것입니다. Shift-and-Invert 전략과 같은 것을 사용하여 중단하고 싶을 때까지 남아있는 가장 큰 해결되지 않은 특이 값을 계속 해결하십시오. SLEPc 와 같은 정교한 패키지에서 이런 종류의 작업을 수행하는 우아한 방법이있을 수 있습니다 .

다른 전략은 다음과 같습니다.

  • 에스1
  • τ에스1에프τ0<에프1
  • 스파 스 SVD 루틴을 호출하십시오.

케이


scipy.sparse.linalg.svds에 'k'를 지정하지 않으면 'tol'매개 변수에 관계없이 기본값은 k = 6이됩니다. 이것이 버그인지 또는 'tol'이 (크기가 아닌) 계산 된 특이 값의 정확도를 나타내는 지 확실하지 않습니다.
Nick Alger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.