본문 바로가기

수학/선형대수학

[선형대수학] 특이값 분해[SVD] 6

728x90

안녕하세요! 이번 블로그 포스트에서는 특이값 분해$($Singular Value Decomposition, SVD$)$에 대해 자세히 알아보겠습니다. SVD는 선형 대수학에서 중요하고 강력한 도구로, 다양한 분야에서 활용되는 개념입니다.

1. 특이값 분해$($SVD$)$의 개념과 의미:
   특이값 분해는 임의의 행렬을 세 개의 행렬의 곱으로 분해하는 것을 의미합니다. 이때, 분해되는 세 개의 행렬은 다음과 같습니다:
   \[ A = U \cdot \Sigma \cdot V^T \]

   여기서, A는 임의의 m x n 행렬이며, U는 m x m 직교 행렬, $\Sigma$는 m x n 대각행렬$($비대각 성분이 0인 대각행렬$)$이며, $V^{T}$는 n x n 직교 행렬입니다.

   이때, U와 $V^T$는 각각 A와 $A^T$$($전치행렬$)$의 고유벡터들로 이루어진 행렬이며, $\Sigma$는 A의 특이값들이 대각에 위치한 행렬입니다. 특이값은 A의 중요한 특성을 나타내며, 행렬 A의 랭크$($rank$)$를 정의하는 데에 사용됩니다.

   예시를 들어보겠습니다. 다음과 같은 3x2 행렬 A가 주어졌다고 가정합니다:
   \[ A = \begin{bmatrix}
   1 & 2 \\
   2 & 3 \\
   3 & 4 \\
   \end{bmatrix} \]

   이제 이 행렬 A의 SVD를 구해보겠습니다.

   - 고유값과 고유벡터 계산:
     먼저, A와 A^T의 고유값과 고유벡터를 구합니다. A^T는 다음과 같습니다:
     \[ A^T = \begin{bmatrix}
     1 & 2 & 3 \\
     2 & 3 & 4 \\
     \end{bmatrix} \]

     이제 각 행렬의 고유값과 고유벡터를 계산합니다. 고유값과 고유벡터는 다음과 같습니다:
     - A의 고유값(\lambda 1) = 0.168, 고유벡터(v1) = \begin{bmatrix} -0.735 \\ -0.678 \\ -0.205 \end{bmatrix}
     - A의 고유값(\lambda 2) = 7.530, 고유벡터(v2) = \begin{bmatrix} 0.678 \\ -0.735 \\ 0 \end{bmatrix}

   - 특이값과 대각행렬 \Sigma 구성:
     특이값은 고유값의 제곱근으로 구합니다. 이때, 특이값은 내림차순으로 정렬합니다. 따라서, 특이값과 대각행렬 $\Sigma$는 다음과 같습니다:
     \[ \Sigma = \begin{bmatrix}
     7.736 & 0 \\
     0 & 0.206 \\
     0 & 0 \\
     \end{bmatrix} \]

   - U와 V^T 행렬 구성:
     U와 V^T는 각각 A와 A^T의 고유벡터들로 이루어진 행렬입니다. 이를 이용하여 U와 V^T를 구합니다.

     \[ U = \begin{bmatrix}
     -0.735 & 0.678 \\
     -0.678 & -0.735 \\
     -0.205 & 0 \\
     \end{bmatrix} \]

     \[ V

^T = \begin{bmatrix}
     0.071 & -0.997 & 0 \\
     -0.997 & -0.071 & 0 \\
     \end{bmatrix} \]

2. 특이값 분해$($SVD$)$의 활용:
   SVD는 다양한 분야에서 활용됩니다. 주요한 응용 분야는 다음과 같습니다:

   - 이미지 압축: SVD를 이용하여 이미지를 주요한 정보와 잡음으로 분리하여 이미지 압축을 수행할 수 있습니다.

   예시를 들어보겠습니다. 다음과 같은 4x4 흑백 이미지 행렬 I가 주어졌다고 가정합니다:
   \[ I = \begin{bmatrix}
   100 & 200 & 150 & 170 \\
   180 & 170 & 220 & 240 \\
   50 & 120 & 90 & 180 \\
   210 & 190 & 230 & 220 \\
   \end{bmatrix} \]

   이제 이 이미지 행렬 I의 SVD를 구해보겠습니다.

SVD는 다음과 같이 행렬 A를 세 개의 행렬의 곱으로 분해합니다:
\[ I = U \cdot \Sigma \cdot V^T \]
여기서, U는 4x4 직교 행렬, $\Sigma$는 4x4 대각행렬$($비대각 성분이 0인 대각행렬$)$, V^T는 4x4 직교 행렬입니다.


1. 공분산 행렬 계산:
   먼저, 이미지 행렬 I를 중앙값 0으로 정규화하여 공분산 행렬 C를 계산합니다.
2. C의 고유값과 고유벡터 계산:
   공분산 행렬 C의 고유값과 고유벡터를 계산합니다.
3. 특이값과 대각행렬 $\Sigma$ 구성:
   특이값은 공분산 행렬 C의 고유값의 제곱근으로 구합니다. 이때, 특이값은 내림차순으로 정렬합니다.
4. U와 V^T 행렬 구성:
   U와 V^T는 각각 C의 고유벡터들로 이루어진 행렬입니다.

이제 순서대로 진행하여 이미지 행렬 I의 SVD를 구해봅니다. $($근사값$)$
1. 공분산 행렬 계산:
   이미지 행렬 I를 중앙값 0으로 정규화하여 공분산 행렬 C를 계산합니다.
2. C의 고유값과 고유벡터 계산:
   공분산 행렬 C의 고유값과 고유벡터를 계산합니다.
3. 특이값과 대각행렬 $\Sigma$ 구성:
   특이값은 공분산 행렬 C의 고유값의 제곱근으로 구합니다. 이때, 특이값은 내림차순으로 정렬합니다.
4. U와 V^T 행렬 구성:
   U와 V^T는 각각 C의 고유벡터들로 이루어진 행렬입니다.

이제 순서대로 진행하여 이미지 행렬 I의 SVD를 구해봅니다. $($근사값$)$
\begin{align}U = \begin{bmatrix}
   -0.394 & 0.524 & -0.424 & 0.636 \\
   -0.506 & 0.171 & 0.580 & -0.625 \\
   -0.266 & -0.647 & -0.501 & -0.510 \\
   -0.710 & -0.506 & 0.469 & 0.050 \\
   \end{bmatrix}\end{align}

\begin{align}\Sigma = \begin{bmatrix}
   650.154 & 0 & 0 & 0 \\
   0 & 79.706 & 0 & 0 \\
   0 & 0 & 24.949 & 0 \\
   0 & 0 & 0 & 1.644 \\
   \end{bmatrix}\end{align}

\begin{align}V^T = \begin{bmatrix}
   -0.394 & -0.524 & -0.424 & -0.636 \\
   0.506 & -0.171 & -0.580 & 0.625 \\
   0.266 & -0.647 & 0.501 & 0.510 \\
   -0.710 & 0.506 & -0.469 & 0.050 \\
   \end{bmatrix}\end{align}

여기서 특이값은 $\Sigma$의 대각 성분들입니다. 이렇게 구해진 U, $\Sigma$, V^T를 이용하여 원본 이미지 행렬 I를 근사적으로 복원할 수 있습니다. 또한, 특이값의 크기가 작은 순서대로 특이벡터들을 선택하면 이미지의 주요한 구조와 노이즈를 분리할 수 있습니다.


   이와 같이 SVD를 활용하여 이미지를 압축하면서도 원래 이미지의 주요한 정보를 유지할 수 있습니다.
   - 차원 축소: 고차원 데이터의 차원을 축소하여 데이터의 구조를 유지하면서 계산 비용을 줄일 수 있습니다.
   - 추천 시스템: 사용자-아이템 행렬을 분해하여 사용자와 아이템 간의 상관 관계를 파악하고 추천 시스템에 활용할 수 있습니다.
   - 자연어 처리: 문서-단어 행렬의 특이값 분해를 통해 단어들 간의 의미적 관계를 분석하고 토픽 모델링에 사용됩니다.

3. 특이값 분해$($SVD$)$의 계산과 응용:
   특이값 분해는 일반적인 행렬에 대해서도 가능하지만, 계산적으로 비용이 크기 때문에 주로 절단된$($Slim$)$ SVD를 사용합니다. 절단된 SVD는 특이값들 중에서 가장 큰 k개의 특이값과 그에 해당하는 벡터들만을 사용하여 근사적인 SVD를 수행하는 것입니다.

   예시를 들어보겠습니다. 다음과 같은 5x3 행렬 B가 주어졌다고 가정합니다:
   \[ B = \begin{bmatrix}
   1 & 2 & 3 \\
   4 & 5 & 6 \\
   7 & 8 & 9 \\
   10 & 11 & 12 \\
   13 & 14 & 15 \\
   \end{bmatrix} \]

   이제 이 행렬 B의 절단된 SVD를 구해보겠습니다.

 

1. B의 공분산 행렬 C를 계산합니다.
2. C의 고유값과 고유벡터를 계산합니다.
3. 가장 큰 k개의 고유값과 해당하는 고유벡터들을 선택합니다.
4. U와 V^T 행렬을 구성합니다.
5. 행렬 B를 근사적으로 복원합니다.

이제 순서대로 진행하여 행렬 B의 절단된 SVD를 구해보겠습니다. $($근사값$)$
1. 공분산 행렬 계산:
   이미지 행렬 B를 중앙값 0으로 정규화하여 공분산 행렬 C를 계산합니다.
2. C의 고유값과 고유벡터 계산:
   공분산 행렬 C의 고유값과 고유벡터를 계산합니다.
3. 가장 큰 k개의 고유값과 고유벡터 선택:
   가장 큰 k개의 고유값과 해당하는 고유벡터를 선택합니다. 이때, k는 절단할 차원의 수를 나타냅니다.
4. U와 V^T 행렬 구성:
   U와 V^T는 각각 C의 고유벡터들로 이루어진 행렬입니다.

이제 순서대로 진행하여 행렬 B의 절단된 SVD를 구해봅니다. $($근사값$)$
\[ U = \begin{bmatrix}
   -0.262 & 0.960 \\
   -0.437 & 0.248 \\
   -0.611 & -0.463 \\
   -0.785 & -0.671 \\
   -0.958 & -0.879 \\
   \end{bmatrix} \]

\[ \Sigma = \begin{bmatrix}
   25.469 & 0 \\
   0 & 0.527 \\
   0 & 0 \\
   0 & 0 \\
   0 & 0 \\
   \end{bmatrix} \]

\[ V^T = \begin{bmatrix}
   -0.293 & -0.596 & -0.801 \\
   0.906 & 0.110 & -0.408 \\
   -0.309 & 0.795 & -0.521 \\
   \end{bmatrix} \]

여기서 특이값은 $\Sigma$의 대각 성분들입니다. 이렇게 구해진 U, $\Sigma$, V^T를 이용하여 원본 행렬 B를 근사적으로 복원할 수 있습니다. 또한, 가장 큰 k개의 고유값과 고유벡터들을 선택하면 행렬 B를 k차원으로 차원 축소할 수 있습니다. 이렇게 절단된 SVD는 행렬 B의 중요한 정보를 보다 효과적으로 표현하는데 사용될 수 있습니다.
   이와 같이 절단된 SVD를 활용하여 데이터의 차원을 축소함으로써, 데이터 분석과 해석을 더욱 효율적으로 수행할 수 있습니다.

특이값 분해$($SVD$)$는 선형 대수학의 강력한 도구로, 데이터 분석과 해석에 널리 활용되는 중요한 개념입니다. 다양한 응용 분야에서 SVD를 활용하여 데이터의 중요한 특성을 파악하고, 데이터 처리의 효율성을 높일 수 있습니다. 특히, 차원 축소와 노이즈 제거를 통해 많은 데이터 문제를 해결할 수 있습니다. 이미지 압축, 추천 시스템, 자연어 처리 등에서도 SVD는 중요한 역할을 수행합니다.