특잇값 분해(Singular value decomposition, SVD) - 직교 축 찾기
0) 서론
저번 포스팅에서 SVD의 최종 목적, 그리고 그 시작점을 알게 되었습니다.
그리고 마지막으로 변환 전 직교축을 무엇으로 해야할 지 의문 속에서 포스팅이 끝났죠! 오늘은 바로 여기서부터 시작해 볼까 합니다!
1) 변환 전 직교 축은 대체 무엇?
변환 전 직교축을 대체 무엇으로 할 것인가…
정말 막막하면서도 어려운 문제입니다.
그냥 단순하게 일단 ‘표준 기저'로 할까요?
그러나 이것도 뭔가 아닌 것 같습니다.
선형 변환하면 원래 직교인 것도 뒤틀린다면서요..
EVD에서 인사이트를 한번 얻어볼 수 있지 않을까요?
"행렬A의 '고유값 분해'로 얻은 벡터들이 사실상 행렬 A를 가장 잘 설명해 주는 '축'이 되는걸 보면, '고유값 분해'로 축을 만들면 되겠다"는 생각이 파박 들지 않습니까!?
그러나… 고유값분해는 정방행렬에서만 정의가 됩니다.
더불어 우리는 ‘변환 전 직교하는 축'을 찾고 있는데, 이전에 살펴봤다시피 EVD를 했을 때 직교하는 축을 가지려면 대칭행렬이어야만 하죠..
이야.. 이거 문제가 너무 산적해 있습니다..
2) 문제를 해결하려면 초심의 마음으로
자, 일단 문제가 너무 산적해 있으니 초심으로 돌아가 보죠.
- 일단 EVD는 선형 변환 전 벡터와 선형 변환 후 벡터가 같은 벡터를 찾으려고 했던 것이고,
- 이게 대칭행렬이면 벡터들이 직교하여, 결국 선형 변환 전 직교축과 선형변환 후 직교축이 같아지는 건데,
- 일반 행렬(비대칭 행렬)에서는 위의 상황과 다르게 '같은 직교 축'이 불가능 해서 축을 두개로 나누려고 한거잖아요?
- 그러면 선형 변환 전 축(이후 '입력축'이라고 쉽게 부르겠습니다)과 선형 변환 후 축(이후 '출력축'이라고 부르겠습니다)이 둘 다 직교해야 된다는 당연한 결론에 이르고,
- 우리는 ‘그럼 입력 직교축'은 뭐여야 하는데? 라는 상황에 놓인겁니다.
그런데 시점을 조금만 옮겨보면!
입력축이든 출력축이든 일단 ‘직교'해야 한다는 사실을 알 수 있죠!
다시말해, 지금 '직교축이 뭔데?'를 먼저 설정하는 것보다 우선해서 '일단 확실하게 밝혀진 조건을 먼저 풀자!' 작전입니다.
그렇다면 입력단에서의 축은 서로 직교하려면 $ v_i \cdot v_j =0$이어야 하고(i 벡터(i 축)와 j 벡터(j 축)를 내적하면 0)
변환(행렬) A에 대해서 출력단에서의 축은 서로 직교하려면 $(Av_i)\cdot (Av_j) = 0$이면 되겠다(A 변환을 시킨 i 벡터와 A 변환을 시킨 j 벡터를 내적하면 0)는 결론에 이릅니다.(직교하면 벡터끼리 내적해서 0이 된답니다! $ \cos 90^{\circ} = 0$이니까요!)
오 관점을 옮겨서 확실한 조건을 먼저 풀기 시작하니까 뭔가 서서히 해결되어 나가는 것 같은데요??
3) 직교축 찾기
내적은 위에서 설명했던 것처럼 $\cos$을 사용해서 정의하는 방법($|a||b|\cos \theta$) 말고도 각 성분의 곱의 합으로도 표현할 수 있습니다.($a_xb_x + a_yb_y$)
따라서 행렬 연산에 대해서 내적은 $ A^TB $(A와 B 행렬은 같은 크기의 벡터)로 표현할 수 있습니다.(행렬 곱은 같은 index를 가지는 요소끼리 곱해서 전체 합이 되죠)
따라서 위에서 찾은 $(Av_i)\cdot (Av_j) = 0$을 단순 곱으로 풀면
$(Av_i)^T(Av_j) = v_i^T(A^TA)v_j = 0$이 됩니다.(행렬 곱에 대해서 전체 전치 연산은 각 행렬을 전치 후 자리를 바꿔준 것과 같죠)
그리고 이 식을 다시 보면 $v_i$ 벡터와 $(A^TA)v_j$벡터가 직교하는 걸 찾으면 된다는 결론에 이르죠!
근데 사실 $(A^TA)v_j$ 이 벡터도 어찌됐든 $v_j$벡터를 $(A^TA)$로 선형 변환 했으므로, 기저 벡터(직교 벡터)인 $v_i$벡터를 성분으로 가질 수밖에 없습니다.
그럼 $(A^TA)v_j$ 벡터의 $v_i$성분이 계수 $c_i$를 가지겠네요!
$ (A^TA)v_j = \sum_k c_kv_k$
따라서 $(A^TA)v_j$ 벡터에서 $v_i$를 제외한 다른 모든 벡터($v_j$)는 $v_i$하고 직교라고 했으니까 $v_i$를 내적하면 $c_i$를 알 수 있겠군요?
$ (A^TA)v_j = c_1v_1 + \cdots + c_iv_i + \cdots + c_jv_j + \cdots + c_nv_n $
다시쓰면 $c_i = v_i^T(A^TA)v_j$라고 표현할 수 있겠습니다.
여기서 i랑 j가 다르면 초기식 $v_i^T(A^TA)v_j = 0$에 의해서 모든 값이 0이되고, 결국 i=j일 때의 $c_j$만 살아남겠죠?
수식으로 다시 써보자면 $c_j = v_j^T(A^TA)v_j$입니다.
즉, $c_j$만 살아남았고, 그 계수의 값은 $v_j^T(A^TA)v_j$입니다. 상수죠.
그리고 이 결과를 다시 풀어 써보면 다음과 같습니다.
\begin{align}
(A^TA)v_j &= 0v_1 + \cdots + c_jv_j + \cdots + 0v_n\\
(A^TA)v_j &= c_jv_j
\end{align}
여기서 $c_j$는 상수니까 그냥 $\lambda_j$라고 써보면
$ (A^TA)v_j = \lambda_j v_j $이 됩니다.
음.... 어디서 많이 본 식 모양 같은데...? 어 뭐야! 고윳값분해네!
4) 깨달음
이로써 우리는 알게 되었습니다.
행렬 A라는 변환(행렬곱)은 사실 m x n일때 n차원의 입력을 받아서 m차원의 출력을 하는 역할을 합니다.(실제 행렬곱을 하는 방식을 떠올려 보세요)
근데 $A^TA$ 즉 자기자신의 전치와 행렬 곱을 수행하면 n x n이 되니까 다시 생각해보면, 입력에서의 변환을 의미하는 것을 알 수 있죠!
더불어 자기자신과 전치행렬의 곱은 항상 대칭행렬이니까 여기서 고윳값분해를 하면 직교축을 얻을 수 있겠네요!
그렇다면... 입력 직교축을 이렇게 찾게 되었다면, 출력 직교축도 아주 쉽게 찾을 수 있지 않겠어요?
위의 과정을 그대로 $AA^T$ 즉, m x m으로 만든 행렬에 대해서 수행하면 바로 출력 직교축을 찾을 수 있지 않겠어요?
와 이로써 입력 직교축과 출력 직교축 자체를 찾았습니다!
5) 마무리
오늘은 특이값 분해에서 직교가 변하지 않는 '입력축'과 '출력축'을 어떻게 찾는지 살펴보았습니다.
다음 번에는 이를 바탕으로 이 입력축이 행렬 $A$에 의해 변환되었을 때 '어느 정도' 로 늘어나거나 줄어드는지, '어느 방향' 의 출력축이 되는지를 알아보는 시간을 가져보겠습니다!
'Study > Mathematics' 카테고리의 다른 글
| 특잇값 분해(Singular value decomposition, SVD) - 뒤틀림 정도 찾기 (0) | 2025.11.18 |
|---|---|
| 특잇값 분해(Singular value decomposition, SVD) - 개념2 (0) | 2025.11.16 |
| 특잇값 분해(Singular value decomposition, SVD) - 개념 (0) | 2025.11.15 |
| 푸리에 오디세이(Fourier Odyssey): 라플라스 변환(Laplace Transform) (0) | 2025.11.14 |
| 푸리에 오디세이(Fourier Odyssey): 푸리에 변환 for 컴퓨터(Fourier Transform for computer) (0) | 2025.11.13 |
