잘린 SVD를 계산하기 위해 어떤 빠른 알고리즘이 있습니까?


14

아마도 여기서는 주제에서 벗어 났지만 이미 몇 가지 ( 1 , 2 ) 관련 질문이 있습니다.

문헌 (또는 잘린 SVD 알고리즘에 대한 구글 검색)에서 주변에 파고 것은 논문이 많이 변합니다 사용 다양한 방법으로 잘립니다 SVDs, 그리고 주장 거기를 계산하는 빠른 알고리즘이 있지만, 아무도 그 (자주 인용하지 않고, 절망적를) 그 알고리즘이 무엇인지 지적하고있는 것 같습니다.

내가 찾을 수있는 유일한 것은 redSVD 라이브러리 에서 사용되는 단일 무작위 알고리즘 입니다.

내가보고 싶은 것은 시스템 작동 방식을 이해하는 데 적합한 정확하고 정확하지 않은 알고리즘 세트입니다 (그러나 실제로 실제로 구현하는 것은 아닙니다!).

누구든지 이런 종류의 물건에 대한 좋은 참조가 있습니까?


데이터를 잘 저장하려면 해시 (ram의 생각)에 b-tree (또는 rb-tree)를 사용하십시오. 데이터에 대한 b- 트리가 있으면 O (log (n)) 시간 샘플 Quantile 등을 수행 할 수 있습니다. 큰 데이터의 경우 그러한 샘플링을 사용하여 짧은 시간에 svd 행렬에 대한 적절한 희소 근사를 계산할 수 있습니다. 극단적 인 데이터 압축에 대한 매우 통계적인 접근 방식 인 "압축 감지"를 찾아 볼 수도 있습니다.
EngrStudent-복직 모니카

SVD가 잘림으로써 여러 주요 단수형 벡터 / 값을 찾는 데에만 관심이 있습니까?
아메바는 고

@amoeba Yep, 그 아이디어입니다.
John Doucette

답변:


16

매우 광범위하게 말하면 고유 값 또는 특이 값 분해를 계산하는 두 가지 방법이 있습니다. 하나의 접근법은 행렬을 대각선 화하는 것이며, 이는 본질적으로 전체 고유 값 / 단수 값 분해 (전체 고유 값 스펙트럼)를 동시에 생성합니다. 여기에서 몇 가지 개요를보십시오 : 단일 값 분해 (SVD)를 계산하는 효율적인 알고리즘은 무엇입니까? 대안은 한 번에 하나 또는 여러 개의 고유 벡터를 생성하는 반복 알고리즘을 사용하는 것입니다. 원하는 수의 고유 벡터를 계산 한 후에 반복을 중지 할 수 있습니다.

SVD에 대해 반복적 인 알고리즘이 있다고 생각하지 않습니다. 이는 정사각형 대칭 ( n + m ) × ( n + m ) 행렬 A = ( 0 B B 0 ) 의 고유 분해를 수행하여 행렬 B의 SVD를 계산할 수 있기 때문 입니다. 따라서 대신 알고리즘 계산 잘린 SVD, 당신은 무엇을 반복 알고리즘 계산 eigendecomposition 요구되어야 하는지를 묻는 : 잘린 SVD에 대한 알고리즘 eigendecomposition에 대한 반복적 인 알고리즘을 .n×mB(n+m)×(n+m)

A=(0BB0).
algorithm for truncated SVDiterative algorithm for eigendecomposition.

가장 간단한 반복 알고리즘을 전원 반복 이라고 하며 실제로 매우 간단합니다.

  1. x
  2. x 업데이트 xAx
  3. 정규화 xx/x
  4. 수렴하지 않으면 2 단계로 이동하십시오.

더 복잡한 알고리즘은 모두 전력 반복 아이디어를 기반으로하지만 상당히 정교 해집니다. 필요한 수학은 Krylov 하위 공간에 . 알고리즘은 Arnoldi 반복 (제곱 비대칭 매트릭스의 경우), Lanczos 반복 (제곱 대칭 매트릭스의 경우), 및 "암시 적으로 재시작 된 Lanczos 방법"등의 변형 및 그 밖의 것들이다.

예를 들어 다음 교과서에 설명되어 있습니다.

  1. Golub & Van Loan, 매트릭스 계산
  2. Trefethen & Bau, 수치 선형 대수
  3. 데멜, 응용 수치 선형 대수
  4. 큰 고유 값 문제에 대한 Saad, 숫자 방법

모든 합리적인 프로그래밍 언어와 통계 패키지 (Matlab, R, Python numpy, 사용자 이름)는 동일한 Fortran 라이브러리를 사용하여 고유 / 단일 값 분해를 수행합니다. 이들은 LAPACKARPACK . ARPACK은 ARnoldi PACKage의 약자이며 Arnoldi / Lanczos 반복에 관한 것입니다. 예를 들어 Matlab에는 SVD에 대한 두 가지 기능이 있습니다. svdLAPACK을 통해 전체 분해를 수행하고 svdsARPACK을 통해 주어진 수의 특이 벡터를 계산하며 실제로 eigs는 "제곱 크기"매트릭스에 대한 호출 의 래퍼입니다 .

최신 정보

BAAB

이 메소드들에 대한 포트란 라이브러리도 있는데 PROPACK 이라고 합니다 :

소프트웨어 패키지 PROPACK에는 크고 희박하거나 구조화 된 행렬의 특이 값 분해를 계산하기위한 함수 세트가 포함되어 있습니다. SVD 루틴은 BPRO (partial reorthogonalization)를 사용하는 Lanczos bidiagonalization 알고리즘을 기반으로합니다.

그러나 PROPACK은 ARPACK보다 훨씬 덜 표준적인 것으로 보이며 표준 프로그래밍 언어에서는 기본적으로 지원되지 않습니다. 그것은 좋은 개요처럼 보이는 부분적인 직교 화와 함께 90 페이지 길이의 1998 년 논문 Lanczos bidiagonalization을 가진 Rasmus Larsen에 의해 작성되었습니다 . 이 Computational Science SE 스레드 를 통해 @MichaelGrant에게 감사합니다 .

가장 최근의 논문들 중에서 가장 인기있는 논문은 2005 년 Baglama & Reichel 인 것으로 보인다. Augmented는 암시 적으로 재시작 된 Lanczos bidiagonalization 방법 이다. 댓글에이 링크를 제공 한 @Dougal에게 감사합니다.

업데이트 2

실제로 자신이 인용 한 개요 논문에 자세히 설명 된 완전히 다른 접근법이 있습니다 : Halko et al. 2009, 무작위 구조 찾기 : 근사 행렬 분해 구성을위한 확률 알고리즘 . 나는 그것에 대해 언급하기에 충분하지 않습니다.


SVD 특정 반복 방법이 있습니다. 예를 들어, 증강 된 암시 적으로 재시작 된 Lanczos 이분법 화 방법 , J. Baglama 및 L. Reichel, SIAM J. Sci. 계산. 2005. (본 논문이 여러분이 제공 한 고유 가치 접근법과 근본적으로 다른지 알기 위해 본 논문을 읽지 않았습니다. 사람들이 그 방법을 좋아한다는 것만 알고 계십시오.)
Dougal

1
링크 @Dougal에 감사드립니다. 나는이 방법들 중 어느 것도 잘 모른다고 말해야한다. 그래서 그것에 대해 언급 할 수는 없다. 더 많은 지식을 가진 사람이 다양한 반복 방법 사이의 관계를 설명한다면 좋을 것입니다. 내가 이해하는 한, 바닐라 Lanczos 방법은 SVD가 아닌 제곱 행렬의 고유 값을 계산하는 것입니다. "확장 된 암시 적으로 재시작 된 Lanczos"는 이와 밀접하게 관련되어 있어야하지만, 맞습니다. SVD에 관한 것 같습니다. 그것이 모두 어떻게 맞는지 확실하지 않습니다. 좀 더 자세히 살펴보면 답변을 업데이트하겠습니다.
amoeba는

1
@Dougal, 나는 약간의 읽기를하고 업데이트를했습니다.
amoeba는

@amoeba는 정규화 된 최소 제곱 의 맥락에서 "절단 된 SVD"는 "원리 성분 회귀" 와 본질적으로 동일 합니까?
GeoMatt22

1
@amoeba Facebook의 무작위 SVD 구현 에 대해 언급 할 수 있습니까? 일부 사람들 현재 가장 빠른 솔루션 중 하나 라고 말합니다 . 이것에 대해 의견을 남기기 위해 편집 할 수 있다면 좋을 것입니다.
Tim

4

방금 빠른 SVD를 통해 스레드를 우연히 발견 했으므로 직접 물건을 알아 내려고 노력하고 있지만 어댑티브 크로스 근사 (ACA)를 살펴 봐야 할 것 입니다.

나는 실제로 어떤 문제가 무엇인지, 필요한 것이 무엇인지 모르지만 행렬이 미디엄 부드러운 함수로 계산되며 대략 분리 된 표현이 필요합니다. 미디엄=나는=0케이나는V나는 실제로 "적절한"SVD가 아니라 ACA 알고리즘은 (거의) 선형 계산 복잡도 (거의)× 행렬은 거의 영형()). 정말 빠릅니다. 불행히도 많은 사람들이 "빠른"이라는 단어를 가볍게 사용합니다.

다시 말하지만, 그것이 작동하면 문제에 달려 있습니다. 많은 경우 개인적으로 ACA는 매우 유용한 수치 도구입니다.

참고 : 이 의견을 작성하고 싶었지만 방금이 계정을 만들었으므로 의견에 대한 평판이 충분하지 않지만 게시는 작동합니다.


2

다음은 잘린 SVD를 계산하기 위해 과거에 Netflix 데이터 세트에서 성공적으로 사용한 기술입니다. 이 논문 에서 발췌 한 것이다 . 공동 필터링 설정에서 대부분의 값이 누락되었으며 그 점을 예측하는 것이 중요하므로 잘린 SVD를 사용하여 이러한 문제를 해결하려면 해당 조건에서 작동하는 기술을 사용해야합니다. 간단한 설명 :

  1. 어떤 작업을 수행하기 전에 간단한 모델 (예 : 전역 평균 + 열 및 행 상수 값)을 적합하게 한 후에 만 ​​잘린 SVD를 사용하여 잔차에 맞 춥니 다.
  2. 각 행과 열 (Netflix 사례의 각 영화와 사용자)에 길이 k (임의의 순위)의 임의 벡터를 초기화합니다.
  3. 알려진 행의 오류를 최소화하기 위해 행 벡터를 고정하고 열 벡터를 업데이트하십시오. 로 유지하고 행렬 항목에 대한 . 절차는 종이에 MATLAB 코드로 제공됩니다.
  4. 열 벡터를 고정한 상태에서 유사한 방식으로 행 벡터를 업데이트하십시오.
  5. 수렴하거나 충분한 결과를 얻을 때까지 3 & 4를 반복하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.