본문 바로가기
AI 공부/Math 데이터사이언스 수학

[데이터사이언스 수학] Matrix Factorization(행렬 분해): 행렬을 분해하는 방법 🧩 SVD로 이미지 압축

by 데이터 벌집 2025. 1. 4.
반응형

Matrix Factorization: 행렬을 분해하는 방법 🧩

[데이터사이언스 수학] Matrix Factorization(행렬 분해): 행렬을 분해하는 방법 🧩

 

Matrix Factorization(행렬 분해), 또는 Matrix Decomposition(행렬 분해)는 주어진 행렬을 여러 구성 요소로 분해하는 기술입니다. 마치 숫자 10을 2와 5로 분해하는 것과 비슷한 개념이에요. 행렬 분해는 선형 방정식을 풀거나, 다양한 계산을 효율적으로 처리하는 데 사용됩니다. 🔍

 

여러 가지 행렬 분해 방법이 있으며, 각 방법은 특정 목적에 맞게 사용됩니다. 가장 일반적인 행렬 분해 기법은 LU 분해, QR 분해, Cholesky 분해, 그리고 특이값 분해(SVD, Singular Value Decomposition) 등이 있습니다.

 

주요 행렬 분해 기법 📊

  1. LU Decomposition
    • LU 분해는 정사각형 행렬에 사용되며, 행렬을 L(Lower triangular matrix)와 U(Upper triangular matrix)로 분해합니다.
  2. QR Decomposition
    • QR 분해m x n 크기의 행렬에 사용되며, 행렬을 Q(Orthogonal matrix)와 R(Upper triangular matrix)로 분해합니다. 이는 LU 분해와 달리 정사각형 행렬에만 제한되지 않습니다.
  3. Cholesky Decomposition
    • Cholesky 분해는 선형 회귀나 최적화 문제 해결, 시뮬레이션 등에서 사용됩니다. 이 방법은 양의 정부호 행렬에만 적용 가능합니다.
  4. Singular Value Decomposition (SVD)
    • 특이값 분해(SVD)는 행렬을 특이 벡터특이 값으로 분해하는 기법입니다. 다양한 분야에서 유용하게 사용됩니다. 예를 들어, 신호 처리, 심리학, 사회학, 기후 및 대기 과학, 통계학, 천문학 등에서 활용됩니다.

Singular Value Decomposition (SVD) 📏

SVD는 행렬을 좌측 특이 행렬(U), 우측 특이 행렬(V), 대각 행렬(Σ)로 분해합니다. 이 대각 행렬 Σ의 각 요소는 특이 값으로, 이 값들은 0 이상의 실수입니다.

 

Singular Value Decomposition (SVD) 📏

 

SVD를 이용한 이미지 압축 예제 💻

이미지 데이터를 압축하기 위해, 우리는 이미지를 SVD를 사용하여 U, Σ, Vh로 분해한 뒤, 특정 특이값(Singular values)만 남기고 나머지는 제거하여 압축을 수행합니다. 이후 이 압축된 데이터를 사용해 이미지를 재구성할 수 있습니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy import misc

# 이미지 로드 (예시로 'camera' 이미지를 사용)
image = misc.face(gray=True)

# 이미지 크기 출력
print(f"Original Image Shape: {image.shape}")

# SVD 분해
U, s, Vh = np.linalg.svd(image, full_matrices=False)

# SVD에서 특이값만 사용하여 압축
k = 50  # 특이값 개수 (압축 비율)
S_k = np.diag(s[:k])  # k개의 특이값으로 대각 행렬 생성

# 압축된 이미지 재구성
compressed_image = np.dot(U[:, :k], np.dot(S_k, Vh[:k, :]))

# 원본 이미지와 압축된 이미지 출력
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[0].axis('off')

ax[1].imshow(compressed_image, cmap='gray')
ax[1].set_title(f'Compressed Image with {k} Singular Values')
ax[1].axis('off')

plt.show()

코드 설명:

  1. 이미지 로드: scipy.misc.face 함수를 사용하여 예시 이미지를 로드합니다. 이 이미지는 흑백 얼굴 이미지로 사용됩니다.
  2. SVD 분해: np.linalg.svd()를 사용하여 이미지를 분해하고, U, Σ, Vh를 얻습니다.
  3. 압축: k = 50으로 설정하여 50개의 특이값만 사용해 이미지를 압축합니다. 나머지 특이값은 제거됩니다.
  4. 이미지 재구성: 압축된 데이터를 사용하여 이미지를 재구성합니다.
  5. 출력: 원본 이미지와 압축된 이미지를 비교하여 출력합니다.

이 방법은 이미지 압축을 통해 차원 축소데이터 압축이 어떻게 이루어지는지를 시각적으로 잘 보여줍니다. SVD는 이렇게 큰 데이터셋을 다룰 때 매우 유용한 도구입니다. 😄

SVD의 활용 분야 🎯

  1. 차원 축소 (Dimensionality Reduction)
    • SVD는 데이터의 주요 성분을 추출하는 데 유용합니다. 이는 주로 PCA(Principal Component Analysis)에서 사용됩니다. 데이터의 복잡성을 줄이면서도 중요한 정보는 보존할 수 있게 도와줍니다.
  2. 추천 시스템 (Recommendation Systems)
    • 영화 추천 시스템과 같은 추천 시스템에서 SVD는 사용자와 항목 간의 관계를 추출하는 데 사용됩니다. 이를 통해 사용자에게 맞춤형 추천을 할 수 있습니다.
  3. 이미지 압축 (Image Compression)
    • SVD는 이미지를 압축할 때도 사용됩니다. 이미지 데이터를 특이값을 기준으로 압축하고, 그 결과를 다시 복원하여 원본에 가까운 이미지를 생성할 수 있습니다.
  4. 음성 처리 및 신호 처리
    • 신호 처리에서는 잡음을 제거하고 유용한 정보를 추출하는 데 SVD가 사용됩니다.

결론 🎯

Matrix Factorization과 그 중에서 Singular Value Decomposition(SVD)는 데이터 과학, 기계학습, 통계학 등에서 매우 중요한 역할을 합니다. 데이터의 차원 축소, 추천 시스템, 이미지 처리 등에서 유용하게 활용되며, 행렬을 분해하여 중요한 정보를 추출하는 기술입니다. 이를 통해 복잡한 데이터를 더 잘 이해하고, 효율적으로 분석할 수 있습니다. 🚀

 

SVD의 힘을 이해하고, 다양한 분야에서 어떻게 활용되는지 배워보세요!

 
 
반응형