특잇값 분해(SVD) 계산기 쉽게 이해하기 — 개념과 원리
이 계산기는 모든 행렬의 특잇값 분해 A = U·Σ·Vᵀ를 구합니다. 특잇값, 왼쪽 특이벡터 U, 대각행렬 Σ, 오른쪽 특이벡터 V, 계수, 얇은 분해의 크기를 보여 줍니다. 선형대수 수업, 데이터 압축, 주성분분석, 최소제곱, 신호처리에 씁니다.
계산 방법
- 특잇값 σ₁ ≥ σ₂ ≥ … ≥ 0은 AᵀA의 고윳값의 제곱근입니다.
- V의 열 vᵢ는 AᵀA의 대응하는 단위 고유벡터입니다.
- U의 열은 uᵢ = A·vᵢ ÷ σᵢ입니다.
- 얇은 분해는 U와 V에 k = min(m, n)개의 열만 둡니다.
단측 야코비 방법으로 계산하며, 각 vᵢ의 가장 큰 성분이 양수가 되도록 부호를 정합니다. 특이벡터는 이런 부호 뒤집기(그리고 같은 특잇값 안에서의 회전)만큼은 유일하지 않습니다.
원리
모든 선형사상은 세 단계로 나눌 수 있습니다. 회전 또는 반사(Vᵀ), 서로 수직인 축을 따른 늘림(Σ), 다시 회전 또는 반사(U)입니다. 특잇값 분해가 이 단계를 찾아냅니다. 오른쪽 특이벡터는 A가 서로 수직인 출력 방향으로 보내는 입력 방향이고, 특잇값은 늘림 배율입니다. 큰 특잇값 몇 개만 남기면 A에 가장 가까운 낮은 계수 근사가 되며, 이것이 이미지 압축과 주성분분석의 바탕입니다.
예제 풀이
기본 행렬은 A = [1 −1 3; 3 1 1]입니다.
- AAᵀ = [11 5; 5 11]의 고윳값은 16과 6이므로 σ = 4, 2.44949(√6)입니다.
- v₁ = (1, 0, 1)/√2 ≈ (0.707107, 0, 0.707107), v₂ = (1, 1, −1)/√3 ≈ (0.57735, 0.57735, −0.57735)
- u₁ = A·v₁ ÷ 4 = (4/√2, 4/√2) ÷ 4 = (0.707107, 0.707107)
- u₂ = A·v₂ ÷ √6 = (−3/√3, 3/√3) ÷ √6 ≈ (−0.707107, 0.707107)
- Σ = [4 0; 0 2.44949], 계수 2, 크기는 U 2×2, Σ 2×2, V 3×2입니다.
결과 해석
0이 아닌 특잇값의 개수가 계수입니다. σ₁ ÷ σ_k는 행렬이 계수를 잃는 상태에 얼마나 가까운지 보여 줍니다. 각 항 σᵢ·uᵢ·vᵢᵀ는 A의 계수 1인 조각이며, 특잇값이 빠르게 작아지면 앞의 몇 항이 A의 대부분을 담습니다. 프로그램마다 uᵢ, vᵢ 한 쌍의 부호가 반대로 나올 수 있지만 둘 다 맞습니다. 검산하려면 U·Σ·Vᵀ를 직접 곱해 원래 행렬이 나오는지 확인하면 됩니다.
흔한 실수
- U와 V가 유일하다고 생각하는 경우(짝을 이룬 부호가 바뀔 수 있습니다)
- 얇은 분해와 0이 곱해지는 열을 더한 완전 분해를 혼동하는 경우
- 일부 정사각행렬에만 존재하는 고유분해를 대신 쓰는 경우
- A = UΣVᵀ에서 V의 전치를 잊는 경우
자주 묻는 질문
특잇값 분해와 고유분해는 어떻게 다른가요?
특잇값 분해는 모든 행렬에 존재하고 두 개의 정규직교기저를 쓰며, 고유분해는 정사각행렬이 필요하고 존재하지 않을 수도 있습니다.
압축에는 어떻게 쓰나요?
큰 특잇값 r개와 그 벡터만 남기면 최소제곱 의미에서 가장 좋은 계수 r 근사가 됩니다.
프로그램마다 부호가 다른 이유는 무엇인가요?
uᵢ와 vᵢ의 부호를 함께 바꿔도 곱이 같으므로 두 결과 모두 맞습니다.
출처: Coordinated Linear Algebra (University of Nebraska–Lincoln), §7.7 Singular Value Decomposition · J. Demmel, UC Berkeley Math 221, Lecture 3 (Fall 2011)