[차원축소] EVD, SVD, PCA, LDA
차원 축소는 차원의 저주 문제들을 해결해주며 모델 학습에 있어 주요 특징들만
학습시킬 수 있게되어 머신러닝에 있어서 아주 중요한 기법인데요.
대표적으로 고유값과 고유벡터를 이용한 차원 축소 기법들을 공부해보겠습니다.
알아야 할 수학 정의
1. 고유값과 고유벡터
Ax = Λx
x 벡터에 A 행렬 곱하여 선형변환을 했을 때 이때 람다(실수)와 x벡터를 곱한 것이 같다면
이때 A를 고유 값이라고 하고 이를 만족하는 기저들을 고유벡터라고 한다.
이를 통해 얻을 수 있는 것은 기저를 변환 시켜 A를 선형변환시킨 것이 얼마나 실수배 되었는 지 한눈에 파악한다는 이점이 있다.
SVD (Sigular Value Decomposition, 특이값 분해)
특이값 분해(Singular Value Decomposition, SVD)는 고유값, 고유벡터의 성질과 직교행렬을 이용하여
행렬을 분해하는 방법이다.
위와 같은 A라는 행렬을 U, Σ, Vt 로 분해하는 것을 말한다.
A: M by N recangular matirx(직사각행렬)
U: M by M orthogonal matrix(직교행렬)
Σ: M by N diagonal matrix(대각행렬)
V: N by N orthogonal matirx(직교행렬)
만약, A 가 M by M 정방행렬이라면 EVD(Eigen Value Decomposition)을 적용할 수 있을 것이다. A= PDP-1
Σ는 대각행렬로 원소를 A의 Rank 만큼 가지게 되며 대각 성분들을 람다로 많이 표현된다.
분해
A = UΣVt 라고 할 때
V = [v1, v2] 이며 v1,v2라는 열벡터를 가지고
U = [u1, u2] 이며 A*v1, A*v2로 선형변환된(크기 변동 o, 길이 변동 x) 벡터에 대해서
크기 1로 정규화한 벡터를 u1,u2를 열벡터로 가진다.
Σ 는 람다를 원소로하는 대각행렬이므로 [[Λ1,0],[0,Λ2]]와 같이 표현할 수 있다.
Truncated SVD
A = 3 by 4 행렬 이라고 했을 때
A = UΣVt를 전개하게 되면 (M>N 이므로 M 만큼의 람다를 가지게 됨) [Λ1*v1*u1 + Λ2*v2*u2 + Λ3*v3*u3] (Full SVD)가 된다.
이때 람다는 고유값이자 실수이며 값이 높을 수록 A라는 행렬의 중요 특성들을 담고 있는 값이다.
왜냐하면 |v*u| <=1 라는 특성이 있기 때문에 A라는 행렬의 중요한 특성들은 사실 고유값만 가지고 판별할 수 있다.
따라서 Turncted SVD란 행렬에서 중요한 특성을 담고있는 고유값 연산만 추출하여서 사용하여서 상대적으로
중요도가 낮은 특성에 대해서 고려하지 않아 모델학습시 중요한 특징들 중점들로 학습시켜 학습률을 올릴 수 있다.
ex)[Λ1*v1*u1 + Λ2*v2*u2 + Λ3*v3*u3](Full SVD) -> [Λ1*v1*u1 + Λ2*v2*u2](Truncated SVD)
PCA (Principal component analysis, 주성분 분석)
데이터들을 어떠한 벡터에 정상영 시켜 차원 축소를 했을 때 원본데이터를 가장 잘 유지할 수 있을까 핵심 문제임
계산 방법을 간단히 얘기하면
1. 데이터의 공분산 행렬(A)을 구하고
2. Ax = Λx (Λ: 고유값)을 갖도록 하는 x(고유벡터)를 찾는다.
이때 고유벡터는 데이터들을 정사영했을 때 원본데이터를 가장 잘 유지할 수 있는 기저이다.(라그랑주를 통해 증명, SVD 방식 적용)
3. 고유벡터에 데이터들을 정사영시켜 차원 축소를 한다.
고유벡터의 개수 만큼 차원을 축소하게되며 각 기저의 정사영했을 때의 데이터의 분산을 통해
얼마나 데이터 원본을 유지하며 차원을 축소하였는 지 알 수 있게 된다. (축소한 차원 개수 만큼 분산이 나옴 ex: sklearn)
1.공분산 행렬 하기
X = [x1,x2,x3] 라는 데이터가 있을 때(shape = (100,3))
각 행렬의 열에 대한 평균을 빼줘 편차를 구하게 된다.
X = [x1-m(x1), x2-m(x2), x3-m(x3)] = [v1, v2, v3]
X*Xt 를 통해 공분산 행렬을 구하게 된다.
공분산행렬 =
[[dot(v1,v1),dot(v1,v2),dot(v1,v3) ],
[dot(v2,v1), dot(v2,v2), dot(v2,v3) ],
[dot(v3,v1), dot(v3,v2), dot(v3,v3)]]
이때 샘플 수가 기하급수적으로 늘어나게 될 경우 dot(v,v) 연산 값의 크기도 무한대로 늘어나게 된다.
이를 방지하기 위해서 샘플 수(n) 만큼 나눠준다.
공분산행렬 =
[[dot(v1,v1)/100 ,dot(v1,v2)/100 ,dot(v1,v3)/100 ],
[dot(v2,v1)/100, dot(v2,v2)/100, dot(v2,v3)/100 ],
[dot(v3,v1)/100, dot(v3,v2)/100, dot(v3,v3)/100]]
2. 고유벡터 찾기
위에서 구해진 공분산 행렬을 A 라고 하자
앞서 설명한 SVD에서 분해하고자 하는 행렬 A가 정방행렬일 때 EVD(Eigen value decomposition)를 이용한다고 말했다.(A= PDP-1)
위 방식을 통해 공분산 행렬 A 대한 고유벡터를 찾을 수 있게 된다.
EVD나 SVD 는 행렬이 정방행렬이냐 직사각행렬이냐의 차이일 뿐 연산 과정이나 도출되는 결과는 같다고 볼 수 있다.
즉, EVD는 SVD 했다고도 얘기할 수 있다.
3. 고유벡터를 기저로 데이터 정사영
기저 개수는 우리가 정하는 하이퍼파라미터이며 장사영하였을 때 기저 만큼 정보유실이
얼마나 되었는 지 각 데이터 분산을 통해 알 수 있다.
SVD와 PCA 차이점
PCA는 공분산 행렬(평균을 고려한)을 통해 SVD를 수행하지만
SVD는 분해할 행렬 그 자체를 SVD를 수행합니다. (만약, 데이터의 평균이 0이라면 둘은 같다고 볼 수 있습니다.)
LDA (Linear Discriminant Analysis, 선형판별분석)
기존 PCA는 데이터의 분산을 최대화하는 고유벡터를 찾아 정사영시켜 차원 축소를 하였다면
LDA는 Class 간의 범주를 잘 구분하고(class간의 중심(평균)이 멀도록) 각 class의 분산은 최소화
(각 클래스 중심으로 부터 분산)하는 고유벡터를 찾아 정사영시켜 차원 축소를 한다.
계산
p차원의 입력벡터 x를 w라는 고유벡터에 정사영 시킨 후 생성되는 값을 y 라고 정의해보자.
이때 데이터의 Class 는 c1,c2 라고 하고 각 class의 평균을 중심으로 한다.
이때 각 class의 중심은 m1, m2라고 정의한다.
w를 찾아야하는데 이때 w는 각 클래스의 중심으로 부터 멀리 떨어진(잘 구분되는) w(고유벡터)를
찾아야 합니다.
m2-m1 = mk라고 하고 f(mk) = wt*mk라고 할 때
max(mk) 하는 w를 찾아야 한다.
두 클래스의 중심은 최대화하고, 분산은 최소화하는 목적함수를 다음과 같이 세울 수 있습니다.
미분을 통해서 J(w)를 미분하여 미분 값이 0이 되는 점에서 최대값을 가집니다.
이를 정리해보면 아래와 같이 되며 이는 고유값, 고유벡터를 구할 때 AX = ΛX 이 됩니다.
Sb의 역행렬과 Sw를 내적한 행렬의 고유벡터는 데이터 클래스 별 평균과 분산을 통해서 구할 수 있습니다.
그리고 구한 Sb,Sw를 SVD하여 W를 구할 수 있습니다.
위 LDA 공부는 https://ratsgo.github.io/machine%20learning/2017/03/21/LDA/바탕으로 이해하며 재작성했습니다.
선형판별분석(Linear Discriminant Analysis) · ratsgo's blog
이번 포스팅에선 선형판별분석(Linear Discriminant Analysis : LDA)에 대해서 살펴보고자 합니다. LDA는 데이터 분포를 학습해 결정경계(Decision boundary)를 만들어 데이터를 분류(classification)하는 모델입니
ratsgo.github.io
1. SVD 와 Truncated SVD 차이
SVD는 Full SVD를 의미하며 Truncated SVD는 중요한 정보(원소 값이 큰)를 가진 대각행렬 원소들의 행,열 만
남기고 나머지는 drop하여 중요한 정보만을 뽑아 내어 축소하는 것을 말한다.
2. PCA와 LDA 차이점
PCA 는 각 데이터의 분산을 최대화하는 고유벡터를 찾아 정사영하고 차원 축소를 진행하기 때문에
전반적인 데이터의 성질의 유실을 최소화하는 차원 축소기법이라고 한다면
LDA는 데이터의 분산보다는 class간의 구분을 최대화하는 고유벡터를 찾아 정사영 시키고 차원 축소를 한다.
이 두개의 차원 축소 기법은 용례 자체가 다르다고 볼 수 있을 것 같다.
3. SVD를 이용한 차원 축소는 데이터를 ___ 만, PCA는 데이터를 ___ 한다.
중요한 특성들만을 남기는 방식으로 특이값 분해를 하지만
PCA는 데이터를 전반적인 경향을 고려하여 고유값 분해를 한다.
ps.
- 직접 수기로 계산하기에는 알아야 할 수학기초가 너무 많았다 좀더 시간을 가지고 다시 공부해보고자 한다.
- 그람슈미트, 정방행렬, 대수적 중복도, 기하적 중복도, 행렬식, 가우스 조던 소거법, 직교 대각화, 정규직교, 볼록함수 등등
https://techblog-history-younghunjo1.tistory.com/66
https://www.youtube.com/watch?v=2f1w20LzyTI