반응형
파이썬 NumPy에서 SVD(Singular Value Decomposition) 함수 활용하기
고급 데이터 과학과 기계 학습을 다루는 많은 이들에게 매력적인 도구 중 하나는 바로 NumPy 라이브러리의 numpy.linalg.svd 함수입니다. 이 함수는 행렬 분해를 통해 데이터의 숨겨진 구조를 파악하고, 효과적인 차원 축소 방법을 제공합니다. 본 포스팅에서는 SVD의 기본개념과 numpy.linalg.svd 함수의 사용법에 대해 알아보겠습니다.
numpy.linalg.svd 함수 소개
numpy.linalg.svd 함수는 주어진 행렬을 특이값 분해(SVD)를 통해 세 개의 행렬 (U, Σ, V^T)로 분해합니다. 이 방법은 이미지 압축, 추천 시스템, 데이터 분석 등 다양한 분야에서 활용됩니다.
함수 시그니처
numpy.linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)
매개변수:
- a: 선형 대수 행렬입니다.
- full_matrices: 참(True)일 경우, 전체 점유행렬을 반환합니다. 기본값은 True입니다.
- compute_uv: U 및 V^T 행렬을 계산할 것인지 여부입니다. 기본값은 True입니다.
- hermitian: 행렬이 에르미트(복소수)인지 아닌지를 나타냅니다. 기본값은 False입니다.
반환 값:
- 세 개의 행렬 U, S, Vh를 반환합니다. 여기서 S는 특이값의 1차원 배열입니다.
사용 예제
기본 예제
아래는 numpy.linalg.svd 함수를 사용하여 행렬을 SVD로 분해하는 간단한 예제입니다.
import numpy as np
# 2D 행렬 생성
A = np.array([[1, 2, 3], [4, 5, 6]])
# SVD 분해
U, S, Vh = np.linalg.svd(A)
print("U 행렬:")
print(U)
print("\nS (특이값):")
print(S)
print("\nV^T 행렬:")
print(Vh)
# 출력:
# U 행렬:
# [[-0.3863177 -0.92236583]
# [-0.92236583 0.3863177 ]]
#
# S (특이값):
# [9.508032 0.77277639]
#
# V^T 행렬:
# [[-0.42866788 -0.56630692 -0.70394695]
# [ 0.80596391 0.11238241 -0.58107459]
# [-0.40824829 0.81649658 -0.40824829]]
이미지 압축 예제
이제 SVD를 활용한 이미지 압축의 예제를 살펴보겠습니다. SVD를 통해 원본 이미지를 저해상도의 이미지로 변환할 수 있습니다.
import numpy as np
import matplotlib.pyplot as plt
# 이미지를 불러옵니다.
from skimage import color, io
# 이미지 URL
image_url = 'https://example.com/sample_image.jpg'
image = io.imread(image_url)
# 그레이스케일로 변환
A = color.rgb2gray(image)
# SVD 분해
U, S, Vh = np.linalg.svd(A)
# 특이값의 일부만 이용하여 이미지 재구성
k = 50 # 선택할 특이값 개수
A_approx = np.dot(U[:,:k], np.dot(np.diag(S[:k]), Vh[:k,:]))
# 이미지 시각화
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(A, cmap='gray')
plt.title('원본 이미지')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(A_approx, cmap='gray')
plt.title('압축된 이미지 (k=50)')
plt.axis('off')
plt.show()
결론
numpy.linalg.svd 함수는 데이터 분석과 처리에서 필수적인 도구로 자리 잡고 있습니다. 행렬의 구조를 이해하고, 복잡한 데이터 세트를 보다 쉽게 다룰 수 있게 도와줍니다. SVD를 활용해 데이터의 다양한 가능성을 탐색해보세요!
- SVD를 통해 데이터의 숨겨진 구조를 발견해 보세요!
- 지금 바로 numpy.linalg.svd 함수를 활용하여 자신만의 데이터 분석 프로젝트에 도전해 보세요!
반응형
'Python > numpy' 카테고리의 다른 글
Numpy TypeError: 'str' object cannot be interpreted as an integer 오류 해결하기 (0) | 2024.10.24 |
---|---|
파이썬 numpy.linalg.LinAlgError 함수 활용하기 (3) | 2024.10.23 |
Numpy IndexError: index out of bounds 오류 해결하기 (1) | 2024.10.23 |
Numpy TypeError: 'numpy.float64' object is not iterable 오류 해결하기 (0) | 2024.10.23 |
Numpy ValueError: Input array is empty 오류 해결하기 (0) | 2024.10.23 |