20강 / 20강

특잇값 분해 — 어떤 행렬이든 겹겹이

압축 · 추천 · 주성분이 사는 곳

특잇값 분해 — 어떤 행렬이든 겹겹이
SVD 는 행렬을 중요한 겹부터 차례로 쌓아 올린 것으로 봅니다.

19강의 대각화는 강력했지만 조건이 까다로웠습니다 — 정사각행렬이어야 하고, 독립인 고유벡터가 충분해야 했죠. 현실의 데이터 행렬은 대개 직사각형이라 아예 해당이 안 됩니다.

특잇값 분해(SVD)는 그 제약을 전부 걷어냅니다. 어떤 행렬이든 — 정사각이 아니어도, 랭크가 모자라도 — 이렇게 쪼갤 수 있습니다.

A = U Σ Vᵀ

U 와 V 는 직교행렬(회전), Σ 는 대각선에 특잇값 σ₁ ≥ σ₂ ≥ … ≥ 0 이 놓인 행렬입니다. 읽으면 이렇습니다 — 어떤 일차변환이든 "돌리고, 축마다 늘이고, 다시 돌리기"로 분해된다.

특잇값 = AᵀA 고윳값의 제곱근. AᵀA 는 언제나 대칭이라 잘 풀립니다.
Python 브라우저에서 실행

🎮 그림을 몇 겹으로 줄여 보세요

8×8 짜리 작은 그림을 앞의 k 겹만 써서 되살립니다. k 를 1부터 올려 보세요. 그림에 따라 한두 겹만으로도 거의 원본이 되는 것이 있고, 끝까지 써야 하는 것도 있습니다. 그 차이가 곧 랭크예요.

낮은 랭크 근사 — 이미지 압축이 도는 원리
불러오는 중…

왜 압축이 되는가

m×n 행렬을 통째로 저장하려면 숫자 mn 개가 필요합니다. 그런데 k 겹만 쓰면 u 에 m개, v 에 n개, σ 하나 — 겹마다 m + n + 1 개면 됩니다.

1000×1000 이미지라면 원본은 100만 개, 50겹만 쓰면 약 10만 개. 10분의 1로 줄어드는데 사람 눈에는 별 차이가 없어요. 사진의 정보가 앞쪽 몇 겹에 몰려 있기 때문입니다.

같은 아이디어가 추천 시스템에도 쓰입니다. "사용자 × 영화" 평점 행렬을 낮은 랭크로 근사하면 비어 있는 칸(안 본 영화)의 평점이 예측돼요. 넷플릭스 추천 대회에서 이 방법이 판을 뒤집었습니다.

압축률은 k(m+n+1) vs mn. k 가 작을수록 이득이 큽니다.
Python 브라우저에서 실행

20강을 마치며 — 우리가 지나온 길

화살표 하나에서 시작해 여기까지 왔습니다. 돌아보면 한 줄로 이어집니다.

벡터를 더하고 늘이는 두 연산에서 시작해 (1–3강)

행렬이 그 연산을 한꺼번에 하는 변환임을 보았고 (4–9강)

연립방정식을 소거법으로 풀며 랭크와 공간의 구조를 얻었고 (10–15강)

직교의 눈으로 "못 푸는 문제의 최선"을 찾았고 (16–17강)

고윳값과 SVD로 행렬 자체의 성격을 읽어 냈습니다 (18–20강)

이제 numpy 를 써도 됩니다. np.linalg.solve, eig, svd 가 한 줄로 해 주는 일을 여러분은 손으로 짜 봤고 왜 그런지도 압니다.

다음으로 갈 곳도 넓습니다 — 수치선형대수(큰 행렬을 안정적으로), 최적화(경사하강법의 행렬 계산), 기계학습(전부 행렬 연산), 컴퓨터 그래픽스(변환 행렬의 잔치). 어디로 가든 여기서 배운 것이 바닥에 깔려 있어요.

20강의 개념이 행렬 하나에 전부 담겨 있습니다.
Python 브라우저에서 실행
🤔 확인 문제
SVD A = UΣVᵀ 가 대각화보다 나은 점은?
🤔 확인 문제
0 이 아닌 특잇값의 개수가 뜻하는 것은?
🤔 확인 문제
1000×1000 행렬을 랭크 50 으로 근사하면 저장할 숫자는 대략?