Processing math: 100%
본문 바로가기

수학/선형대수학

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

728x90

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

1. 특이값 분해(SVD)의 개념과 의미:
   특이값 분해는 임의의 행렬을 세 개의 행렬의 곱으로 분해하는 것을 의미합니다. 이때, 분해되는 세 개의 행렬은 다음과 같습니다:
   A=UΣVT

   여기서, A는 임의의 m x n 행렬이며, U는 m x m 직교 행렬, Σ는 m x n 대각행렬(비대각 성분이 0인 대각행렬)이며, VT는 n x n 직교 행렬입니다.

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

   예시를 들어보겠습니다. 다음과 같은 3x2 행렬 A가 주어졌다고 가정합니다:
   A=[122334]

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

   - 고유값과 고유벡터 계산:
     먼저, A와 A^T의 고유값과 고유벡터를 구합니다. A^T는 다음과 같습니다:
     AT=[123234]

     이제 각 행렬의 고유값과 고유벡터를 계산합니다. 고유값과 고유벡터는 다음과 같습니다:
     - A의 고유값λ1 = 0.168, 고유벡터v1 = [0.7350.6780.205]
     - A의 고유값λ2 = 7.530, 고유벡터v2 = [0.6780.7350]

   - 특이값과 대각행렬 \Sigma 구성:
     특이값은 고유값의 제곱근으로 구합니다. 이때, 특이값은 내림차순으로 정렬합니다. 따라서, 특이값과 대각행렬 Σ는 다음과 같습니다:
     Σ=[7.736000.20600]

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

     U=[0.7350.6780.6780.7350.2050]

     VT=[0.0710.99700.9970.0710]

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

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

   예시를 들어보겠습니다. 다음과 같은 4x4 흑백 이미지 행렬 I가 주어졌다고 가정합니다:
   I=[1002001501701801702202405012090180210190230220]

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

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


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

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

이제 순서대로 진행하여 이미지 행렬 I의 SVD를 구해봅니다. (근사값)
U=[0.3940.5240.4240.6360.5060.1710.5800.6250.2660.6470.5010.5100.7100.5060.4690.050]

Σ=[650.154000079.706000024.94900001.644]

VT=[0.3940.5240.4240.6360.5060.1710.5800.6250.2660.6470.5010.5100.7100.5060.4690.050]

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


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

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

   예시를 들어보겠습니다. 다음과 같은 5x3 행렬 B가 주어졌다고 가정합니다:
   B=[123456789101112131415]

   이제 이 행렬 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=[0.2620.9600.4370.2480.6110.4630.7850.6710.9580.879]

Σ=[25.469000.527000000]

VT=[0.2930.5960.8010.9060.1100.4080.3090.7950.521]

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

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