안녕하세요,
이번에는 PCA (Principal Component Analysis)와 SVD(Singular Value Decomposition)에 대해 알아보려 합니다.
PCA와 SVD 모두 차원축소(Dimension Reduction) 기법 중의 하나입니다.
차원 축소란 무엇일까요?
차원 축소란, 고차원 공간의 표본들을 데이터의 분산을 최대한 보존하면서 선형 연관성이 없는 저차원의 공간으로 변형하는 기법입니다.
그렇다면 차원 축소는 왜 필요한 걸까요?
공간의 차원이 증가함에 따라 데이터 공간을 설명하기 위해 데이터를 매우 많이 필요로 하는데, 이에 따라 모델을 학습하는 데 여러가지 문제점이 발생할 수 있습니다. 이를 차원의 저주(Curse of Dimensionality)라 하며, 이를 피하기 위해 차원 축소를 진행합니다.
차원 축소에는 크게 Feature Selection과 Feature Extraction으로 나뉩니다. Feature Selection은 종속성이 강한 Feature를 제거하는 방식이고, Feature Extraction은 기존 Feature들을 조합해 새로운 Feature를 만드는 기법입니다.
이 Feature Extraction 의 대표적인 모델이 PCA와 SVD입니다.
그럼 PCA에 대해 알아볼까요?
이번 포스팅에서는 기하학적인 설명은 배제하도록 하겠습니다.
PCA를 수학적으로 설명한다면, 공분산 행렬(Covariance matrix)을 이용한 차원 축소 방법이라고 간단하게 말할 수 있습니다.
공분산 행렬이란, 변수(Feature)들이 서로에 대해 어떤 상관성을 갖는지 보기위해, 변수간에 짝지을 수 있는 모든 조합에 대해 공분산(변수사이의 상관관계)을 계산해서 행렬로 표현한 것입니다. 공분산 행렬은 정방행렬(square matrix, n*n)이자 대칭행렬(symmetrix matrix)인 특징을 갖습니다.
이 공분산행렬에서 고유벡터(Eingen Vector)와 고유값(Eingen Value)을 구해 원하는 만큼의 고유값을 사용하여 차원 축소를 진행합니다. (고유벡터와 고유값의 정의에 대한 이해는 이 포스팅에서는 넘어가도록 하겠습니다.) 그런데 공분산 행렬에서 고유벡터를 구하는 과정은 시간복잡도가 높습니다.
이러한 시간복잡도를 줄이기 위해선 연산량을 줄여야하는데, 이에 대한 해결책으로 공분산 행렬(n*n)이 아닌 일반행렬(n*m)에서 Feature Extraction 하는 방법이 필요하게 되었습니다. 이 방법이 바로 SVD 입니다.
SVD는 공분산 행렬이 아닌 어떤 행렬이든 적용 가능해 시간적 이점이 있다는 장점이 있습니다.
SVD는 일반행렬(M=n*m)을 M = UΣVT 로 분해하고, 분해해 생긴 UΣ에 선형변환을 해 차원축소를 진행합니다.
위의 내용을 요약해보자면,
PCA는 공분산 행렬을 통한 차원 축소 기법이고, SVD는 행렬 분해를 통한 차원 축소 기법입니다. 하지만 일반적으로 이 두 기법은 상호교환 가능하게 사용됩니다. [2]
PCA는 SVD의 특정 응용 프로그램으로, 주로 차원 축소에 사용되는 반면, SVD는 선형대수 및 데이터 분석에서 일반적으로 사용되는 더 포괄적인 행렬 분해 기법입니다. [2]
SIMCA®에서는 위의 그림과 같이 수많은 변수와 샘플로 이루어진 원본 데이터를 자동으로 PCA 모델을 생성하여 차원 축소를 수행합니다. 이로써 데이터가 한눈에 보기 쉽게 아래와 같은 그림으로 표현되어, 사용자가 편리하게 결과를 도출하고 활용할 수 있습니다.
수학적인 내용은 최대한 배제하고 설명해보았습니다. 혹시나 글을 보시면서 지적해주실 부분이 있으면 언제든지 댓글로 남겨 주시기 바라며, 문의 사항 역시 남겨 주시면 답변 드릴 수 있도록 하겠습니다~
Reference
[1] https://en.wikipedia.org/wiki/Singular_value_decomposition
[2] Krstian Safjan(2023). Whar is the key difference between PCA and SVD. https://safjan.com/what-is-the-key-difference-between-pca-and-svd/
댓글
댓글 쓰기