numpy.linalg.svd
numpy.linalg.svd
개요
`numpy.linalg.svd는 NumPy 라이브러리에서 제공하는 특이값 분해(Singular Value Decomposition, SVD)를 수행하는 함수입니다. SVD는 행렬을 세 개의 특별한 행렬로 분해하는형대수의 기법으로, 데이터 과학, 기계 학습, 신호 처리, 이미지축 등 다양한 분야에서 널리 사용됩니다.
이 함수는 임의의 실수 또는 복소수 행렬을 입력받아, 그 행렬을 좌특이벡터(U), 특이값(S), 우특이벡터(V의 전치)로 분해합니다. 이 문서에서는 numpy.linalg.svd의 개념, 사용법, 응용 사례, 그리고 주의사항을 자세히 다룹니다.
특이값 분해(SVD)란?
특이값 분해(Singular Value Decomposition)는 임의의 ( m \times n ) 크기의 행렬 ( A )를 다음과 같은 형태로 분해하는 방법입니다:
[ A = U \Sigma V^T ]
여기서: - ( U ): ( m \times m ) 크기의 직교행렬(Orthogonal Matrix), 열은 좌특이벡터를 나타냄. - ( \Sigma ): ( m \times n ) 크기의 대각행렬, 대각 원소는 특이값(Singular Values)이며, 내림차순으로 정렬됨. - ( V^T ): ( n \times n ) 크기의 직교행렬의 전치, 행은 우특이벡터를 나타냄.
SVD는 정방행렬이 아니어도 적용 가능하며, 고유값 분해(Eigenvalue Decomposition)보다 더 일반적인 분해 방법입니다.
numpy.linalg.svd 함수 사용법
기본 문법
U, s, Vt = numpy.linalg.svd(A, full_matrices=True, compute_uv=True, hermitian=False)
매개변수 설명
| 매개변수 | 설명 |
|---|---|
A |
분해할 ( m \times n ) 실수 또는 복소수 배열 |
full_matrices |
True이면 ( U )와 ( V^T )를 정방행렬로 반환, False이면 경제형(economy) 분해 수행 |
compute_uv |
True이면 ( U )와 ( V^T )도 계산하여 반환, False이면 특이값 s만 반환 |
hermitian |
입력 행렬이 에르미트(Hermitian) 행렬이라면 True로 설정하여 계산 속도 향상 가능 |
반환값
U: 좌특이벡터 행렬 (( m \times m ) 또는 ( m \times \min(m,n) ))s: 특이값 배열 (길이가 ( \min(m, n) ))Vt: 우특이벡터의 전치 (( n \times n ) 또는 ( \min(m,n) \times n ))
예제 코드
다음은 4×3 행렬에 대해 SVD를 수행하는 예제입니다.
import numpy as np
# 임의의 행렬 생성
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]])
# SVD 분해 수행
U, s, Vt = np.linalg.svd(A, full_matrices=False)
print("U (좌특이벡터):\n", U)
print("s (특이값):", s)
print("Vt (우특이벡터 전치):\n", Vt)
# 재구성 검증
Sigma = np.diag(s)
A_reconstructed = U @ Sigma @ Vt
print("재구성된 A:\n", A_reconstructed)
print("원본과 재구성의 차이:", np.allclose(A, A_reconstructed))
출력 결과에서 A_reconstructed는 원본 행렬 A와 매우 유사하며, 부동소수점 오차 범위 내에서 일치합니다.
응용 분야
1. 차원 축소 (예: PCA)
SVD는 주성분 분석(PCA)의 핵심 기술입니다. 데이터 행렬의 공분산 행렬을 직접 계산하지 않고도 SVD를 통해 주성분을 추출할 수 있습니다.
2. 이미지 압축
특이값 중 큰 값들만 사용해 행렬을 근사함으로써, 이미지의 크기를 줄이면서도 주요 정보를 유지할 수 있습니다.
3. 임의의 행렬의 역행렬 근사 (의사역행렬)
특이값 중 0에 가까운 값을 무시하고 의사역행렬(Pseudo-inverse)을 계산할 수 있습니다. NumPy의 [np.linalg.pinv](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98/np.linalg.pinv)는 내부적으로 SVD를 사용합니다.
A_pinv = np.linalg.pinv(A)
4. 잠재 의미 분석 (LSA)
자연어 처리에서 문서-단어 행렬을 SVD로 분해하여 의미적 구조를 추출하는 데 사용됩니다.
주의사항 및 제한
- 계산 비용: 큰 행렬의 경우 SVD는 계산량이 많을 수 있으므로, 대규모 데이터에는
[scipy.sparse.linalg.svds](/doc/%EA%B8%B0%EC%88%A0/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99/%ED%8A%B9%EC%9D%B4%EA%B0%92%20%EB%B6%84%ED%95%B4/scipy.sparse.linalg.svds)와 같은 근사 알고리즘을 고려해야 합니다. - 수치 안정성: 매우 작은 특이값은 노이즈를 반영할 수 있으므로, 차원 축소 시 임계값을 설정해 필터링하는 것이 일반적입니다.
- 결측치 처리: 원본 데이터에 결측치가 있는 경우, 직접 SVD 적용이 어려우며 행렬 완성(Matrix Completion) 기법을 병행해야 합니다.
관련 문서 및 참고 자료
- NumPy 공식 문서 - linalg.svd
- Golub, G. H., & Van Loan, C. F. (2013). Matrix Computations. Johns Hopkins University Press.
- Scipy SVD 함수
SVD는 데이터 과학의 기초 도구 중 하나로, numpy.linalg.svd는 이를 쉽게 활용할 수 있게 해주는 강력한 함수입니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.