PCA를 공부하면서 대체 SVD로 기저 V를 구하는 방법과 공분산 행렬로 구하는 방법이 뭐가 다른지, SVD는 어떤 방식으로 V를 구하는 건지에 관해 여러모로 골머리를 앓았었는데 오늘 의문이 있었던 부분들이 잘 정리되어 포스팅을 해보려 합니다.
1. SVD에서 기저 V를 구하는 방법
이전 포스팅에서 SVD에서 기저 V를 구하는 방법에 관해 소개하였습니다.
이렇게 특이값 분해한 행렬에서 를 계산합니다.
그러면 이런 결과를 얻을 수 있고, 의 고유값과 고유벡터를 구하면 그 고유벡터가 V이기 때문에 구할 수 있다는 것을 학습한 영상에서 봤는데, 대체 왜 고유벡터를 계산하면 V가 나오는지 이해가 가지 않았습니다. 영어로 된 영상도 몇 개 봤지만 제가 본 영상들에서는 여기까지 다뤄주지는 않아 계속 고민을 했습니다. 를 로 분리하는 것은 가 orthogonal, 가 diagonal이기 때문에 직교대각화인데, 고유값분해는 직교대각화에 포함되는 개념이지 포함하는 개념이 아니기 때문에 뭔가 다른 것이 증명될 필요성을 느꼈습니다. 그래서 의 고유값과 고유벡터가 , 임을 증명하고자 했고, 다음과 같은 과정을 통해 증명하였습니다.(증명된 것을 눈 앞에서 보지 못하면 찝찝한 수학도…)
우선, 특이값분해의 정의에서 다음과 같은 식을 얻을 수 있습니다.
이 식의 양 변 왼쪽에 를 곱해줍시다.
이제 에 를 대입할 겁니다. 이 식은 특이값분해 의 양 변에 transpose를 취해 얻었습니다.
는 orthogonal이고, 는 diagonal이기때문에 위와 같이 쓸 수 있습니다. 여기에서 를 하나의 행렬로 보면, 이 식이 고유값분해의 식과 닮아 있음을 알 수 있습니다. 고유값분해 식을 봅시다.
특이값분해 와 상당히 유사한데, 고유값 분해에서는 양 변에 같은 matrix 가 있는 것에 반해 특이값 분해에는 서로 다른 벡터 와 가 있습니다. 어찌됐건, 으로 두면, 이것은 고유값 분해의 식과 일치합니다. 는 diagonal이고 그것의 제곱도 여전히 diagonal이므로 그렇게 쓰는 데에는 문제가 없습니다.
따라서, 를 고유값 분해한 값이 가 될 수 있는 것입니다.
2. 공분산 행렬로 구하는 방법 = SVD로 구하는 방법
그런데, 여기서 주목할 점은 의 의미입니다. 이것은 공분산 행렬을 대신할 수 있습니다. 공분산 행렬은 대각원소는 분산, 나머지 원소는 공분산을 담고 있습니다. 공분산은 다음과 같이 계산합니다.
그런데, 우리는 PCA를 사용할 때 데이터의 평균이 0이 되도록 미리 전처리해주므로 와 는 0입니다. 따라서 이 식은 이렇게 다시 쓸 수 있습니다.
이것을 풀어서 전개해보면 n개의 데이터가 있다고 가정할 때 다음과 같이 쓸 수 있습니다.
이는 의 각 원소에 n을 곱한 것과 동일합니다. 따라서, 이제는 이렇게 말할 수 있습니다.
다만, 여기서 잠깐 할 이야기가 있는데 pandas에서 제공하는 cov함수를 사용해 공분산 행렬을 구할 경우 를 계산하여 얻는 것과 결과가 약간 다릅니다. 그 이유는 자유도 차이 때문인데, 보통 표본분산을 계산할 때는 자료가 중앙값에 편향되지 않도록 n 대신 n-1을 나눠 주기 때문에 을 계산하면 동일한 결과를 얻을 수 있습니다.
다시 본론으로 돌아와서, 이제 공분산 행렬로 고유값 분해를 하든, SVD에서 고유값 분해를 하든, 어떤 상수배 차이 외에는 동일한 결과를 얻을 것입니다.
이처럼 고유값 분해에 양 변에 상수배를 한다면 분해되었을 때 값이 변하는 부분은 diagonal matrix 입니다. diagonal matrix에 상수배를 할 경우 전체 대각원소에 상수가 그대로 곱해진 행렬이 나오며, 저희가 구하고자 하는 것은 고유값 행렬 에서는 대소관계(상수가 양수라면 상수배를 해도 대소관계는 변하지 않음) 고유벡터 행렬 이므로 결국 이 두 방법은 사실 같은 방법이었다는 것을 알게 되었습니다.
(다시 확인하다가 의문이 생겨 추후 수정 예정입니다.)