특이값 분해(SVD) 계산기
행렬을 A = UΣVᵀ로 쪼개 특이값과 계수(rank), 조건수를 냅니다. 큰 특이값 몇 개만 남긴 저계수 근사를 만들어 그 오차가 에카르트–영 정리가 말하는 값과 같은지 함께 보여 줍니다.
한 줄이 한 행입니다. 칸은 공백이나 쉼표로 나눕니다. 정사각이 아니어도 되고 6×6까지 다룹니다.
3×3 행렬의 특이값
6.669 · 3.476 · 1.855
계수(rank)는 3이고 조건수는 3.6입니다. 입력을 조금 흔들면 해가 최대 3.6배까지 부풀려질 수 있다는 뜻입니다.
특이값
특이값은 이 행렬이 각 방향을 늘이는 배율입니다. σ₁은 어떤 단위벡터를 넣어도 넘을 수 없는 최대 배율이고, 0에 가까운 특이값이 있으면 그 방향은 거의 눌려 없어집니다 — 계수가 모자란다는 뜻입니다.
저계수 근사
큰 특이값 k개만 남기고 나머지를 버립니다.
A_1 (계수 1 근사)
| 2.6569 | 0.7241 | 3.1836 |
| 0.7241 | 0.1974 | 0.8677 |
| 3.1836 | 0.8677 | 3.8148 |
위 두 값이 같습니다. 계수가 k 이하인 행렬 중 A에 가장 가까운 것이 바로 A_k이고, 그때의 거리가 버린 특이값들만으로 정해진다는 것이 에카르트–영 정리입니다. 이미지 압축과 추천 시스템이 이 정리 위에 서 있습니다.
분해 결과
U (3×3 직교행렬)
| 0.6312 | 0.3744 | 0.6793 |
| 0.172 | 0.7864 | -0.5932 |
| 0.7563 | -0.4913 | -0.432 |
Σ (3×3 대각행렬)
| 6.6691 | 0 | 0 |
| 0 | 3.476 | 0 |
| 0 | 0 | 1.8549 |
V (3×3 직교행렬 — 열이 vᵢ)
| 0.6312 | 0.3744 | 0.6793 |
| 0.172 | 0.7864 | -0.5932 |
| 0.7563 | -0.4913 | -0.432 |
U와 V의 부호는 자유롭습니다. u와 v의 부호를 함께 뒤집어도 UΣVᵀ가 같으므로, 다른 프로그램과 값을 견줄 때 열의 부호가 반대로 나올 수 있습니다. 특이값 자체는 하나로 정해집니다.
계산 방법
- 1행렬을 한 줄에 한 행씩 넣습니다. 칸은 공백이나 쉼표로 나눕니다.
- 2특이값 막대에서 어느 방향이 크게 늘어나고 어느 방향이 눌리는지 봅니다.
- 3계수(rank)와 조건수를 확인합니다. 조건수가 크면 그 행렬로 세운 연립방정식은 답이 불안정합니다.
- 4저계수 근사의 k를 바꿔 가며 몇 개만 남겨도 원래 행렬에 얼마나 가까운지 확인합니다.
- 5「실제 오차」와 「에카르트–영이 말하는 값」이 같은지 봅니다. 이것이 이 분해의 값어치입니다.
자주 묻는 질문
어떤 행렬이든 회전 → 축별 늘이기 → 회전 세 단계로 쪼개는 것입니다. A = UΣVᵀ에서 U와 V는 길이를 바꾸지 않는 직교행렬이고, 가운데 Σ는 대각선에만 값이 있어 각 축을 얼마나 늘일지만 정합니다. 대각선에 큰 순서로 놓인 σ₁ ≥ σ₂ ≥ … ≥ 0이 특이값입니다. 정사각행렬이 아니어도, 계수가 모자라도 언제나 됩니다.
특이값은 AᵀA의 고윳값의 제곱근이고, 항상 0 이상의 실수입니다. 고윳값은 정사각행렬에만 있고 음수나 복소수가 될 수 있으며 대각화가 안 되는 행렬도 있지만, 특이값 분해는 어떤 모양의 행렬에도 반드시 존재합니다. 대칭이고 양의 정부호인 행렬에서만 둘이 일치합니다.
큰 특이값 k개만 남긴 A_k가 계수 k 이하인 모든 행렬 중 A에 가장 가깝다는 정리입니다. 게다가 그때의 거리가 정확히 √(σ_k² + σ_{k+1}² + …)로, 버린 특이값들만으로 정해집니다. 이미지 압축·추천 시스템·잡음 제거가 모두 이 정리에 기대고 있습니다. 이 계산기는 A_k를 실제로 만들어 거리를 재고, 그 값이 공식과 같은지 나란히 보여 줍니다.
입력의 작은 오차가 해에서 크게 부풀려집니다. 조건수가 10^k쯤이면 유효자릿수를 k자리쯤 잃는다고 보면 되고, 배정밀도(약 16자리)에서 조건수가 10^16을 넘으면 계산 결과가 통째로 의미를 잃습니다. 「힐베르트 4×4」 예제를 눌러 보면 크기가 조금만 커져도 조건수가 폭발하는 것을 볼 수 있습니다.
그렇지 않습니다. 자주 하는 오해인데, 행렬 전체에 상수를 곱하면 행렬식은 그 상수의 n제곱만큼 달라지지만 조건수는 전혀 바뀌지 않습니다. 조건수는 가장 큰 특이값과 가장 작은 특이값의 비율이라 크기 조절에 영향을 받지 않기 때문입니다. 행렬이 병조건인지는 행렬식이 아니라 조건수로 판단해야 합니다.
정상입니다. uᵢ와 vᵢ의 부호를 함께 뒤집어도 UΣVᵀ는 그대로이므로 부호는 하나로 정해지지 않습니다. 특이값이 겹치는 경우에는 그 자리의 벡터를 고르는 방식도 여러 가지입니다. 하나로 정해지는 것은 특이값 자체이고, 그것으로 견주면 됩니다.
전송되지 않습니다. 분해와 검산이 모두 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 검증은 세 가지 불변량으로 했습니다. UΣVᵀ를 되곱해 A가 돌아오는지, 특이값 제곱합이 프로베니우스 노름의 제곱과 같은지, 정사각행렬에서 특이값의 곱이 행렬식의 절댓값과 같은지를 1행 1열부터 6×6까지 무작위 행렬로 확인했습니다. 행렬식은 여인수 전개로 따로 구해 대조했습니다.
- 에카르트–영 정리도 계산으로 확인했습니다. ‖A − A_k‖_F가 버린 특이값 제곱합의 제곱근과 같은지 보았고, 더해서 계수 k인 무작위 행렬 300개를 만들어 A_k보다 A에 가까운 것이 나오는지 확인했습니다. 하나도 나오지 않았습니다.
- σ₁이 정말 최대 배율인지도 무작위 방향 4,000개를 넣어 확인했습니다. 어떤 방향도 σ₁을 넘지 못했습니다.
- 특이값은 AᵀA의 고윳값을 야코비 회전법으로 구해 제곱근을 취합니다. AᵀA를 만드는 순간 조건수가 제곱되므로 아주 작은 특이값은 상대오차가 커집니다. σ₁의 1억분의 1보다 작은 값은 참고만 하는 것이 안전합니다. 수치 라이브러리가 AᵀA를 만들지 않고 골룹–라인슈 방법을 쓰는 이유가 이것입니다.
- 계수(rank)는 σ₁의 10^-10배를 기준으로 셉니다. 부동소수점 계산에서 특이값이 정확히 0이 되는 일은 드물어 어딘가에서 끊어야 하며, 그 경계 근처의 행렬은 계수 판정이 갈릴 수 있습니다.
- 6행 6열까지 다룹니다. 야코비 회전을 화면에서 즉시 끝내려고 잡은 한계입니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.