SVD y PCA: cómo el álgebra lineal comprime miles de dimensiones

개요

SVD(특이값 분해)와 PCA(주성분 분석)는 고차원 데이터를 효과적으로 압축하고 분석하는 데 사용되는 선형대수학 기법으로, 추천 시스템, 이미지 압축, 머신러닝 전반에 걸쳐 핵심적인 역할을 수행합니다.

주요 내용

* SVD (특이값 분해): 임의의 m x n 행렬 A를 세 개의 행렬 U, Sigma, V^T의 곱으로 분해하는 기법입니다. U와 V는 직교 행렬이며, Sigma는 대각 행렬로 특이값(singular values)을 담고 있습니다. 특이값은 각 방향(벡터)이 데이터의 얼마나 많은 "에너지" 또는 분산을 설명하는지를 나타냅니다.
* PCA (주성분 분석): SVD의 직접적인 응용으로, 데이터의 분산이 가장 큰 방향(주성분)을 찾아 데이터를 해당 방향으로 투영하여 정보 손실을 최소화하면서 차원을 축소하는 기법입니다. PCA를 적용하기 전에 데이터를 중심화(평균을 제거)하는 과정이 선행됩니다.
* 차원 축소의 수학적 근거: Eckart-Young 정리에 따르면, SVD에서 가장 큰 k개의 특이값과 해당 벡터만을 사용하여 원래 행렬을 근사할 때, k개의 특이값만을 사용하는 근사가 최적의 근사(Frobenius norm 기준)임을 보장합니다. 이는 정보 손실을 최소화하면서 데이터를 압축할 수 있는 수학적 기반을 제공합니다.
* SVD 및 PCA의 작동 방식:
* SVD: A = U * Sigma * V^T 형태로 분해하며, U는 좌측 특이 벡터, V는 우측 특이 벡터, Sigma는 특이값 행렬입니다. 특이값은 각 방향의 분산 기여도를 나타냅니다.
* PCA: 데이터 중심화 후 SVD를 적용하며, V의 전치 행렬(V^T)의 행들이 주성분이 됩니다. 이 주성분들은 원래 데이터의 선형 조합으로, 분산 설명량이 높은 순서대로 정렬됩니다.
* 구현 및 예시:
* NumPy의 numpy.linalg.svd 함수를 사용하여 SVD를 직접 수행하고, 이를 바탕으로 PCA를 수동으로 구현할 수 있습니다.
* k개의 주성분을 선택하면 데이터가 k차원으로 축소되며, explained_variance_ratio_를 통해 각 주성분이 설명하는 원본 분산의 비율을 확인할 수 있습니다.
* 이미지 압축 예시에서는 k개의 특이값만을 사용하여 원래 행렬을 근사함으로써 이미지 크기를 줄이고, k 값이 증가함에 따라 원본과의 상대적 오차가 감소하는 것을 보여줍니다.
* 적용 사례: 추천 시스템(협업 필터링), 이미지 압축, 유전자 발현 데이터 분석, 금융 시장 분석 등 고차원 데이터를 다루는 다양한 분야에서 활용됩니다.
* 주의사항 및 모범 사례:
* 스케일링: 서로 다른 스케일을 가진 변수들은 PCA 적용 전에 표준화(평균 0, 표준편차 1)해야 합니다.
* 해석: 주성분은 원본 변수들의 선형 조합이므로, 해석 시 각 변수의 가중치를 확인해야 합니다.
* k 값 선택: Scree plot(누적 분산 설명량 vs. 주성분 개수)을 참고하거나, 90-95%와 같은 특정 분산 설명량 임계값을 설정하여 k를 결정하는 것이 좋습니다.
* 선형성: PCA는 선형 관계만 포착하므로, 비선형 구조에는 t-SNE, UMAP, Autoencoder와 같은 다른 기법이 필요할 수 있습니다.
* 차원의 저주(Curse of Dimensionality): 차원이 증가함에 따라 데이터 포인트 간의 거리가 유사해지고, 공간의 대부분이 표면에 집중되어 직관적인 기하학적 해석이 어려워집니다. PCA는 이러한 상황에서 효과적으로 정보가 담긴 실제 차원을 찾아 노이즈를 제거하는 역할을 합니다.
* 라이브러리 활용: 프로덕션 환경에서는 scikit-learnPCA 클래스를 사용하는 것이 일반적이며, 이는 추가적인 검증 및 다양한 솔버 옵션을 제공합니다. 희소 행렬(sparse matrix)의 경우 TruncatedSVD를 사용하는 것이 메모리 효율적입니다.

시사점

SVD와 PCA는 고차원 데이터를 효율적으로 압축하고, 잡음을 제거하며, 데이터의 주요 패턴을 추출하는 강력한 도구로서, 데이터 과학 및 머신러닝 모델의 성능 향상과 계산 효율성 증대에 필수적입니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions