보강 1. 주성분분석과 SVD Principal Component Analysis and the SVD — 서술
L34의 마지막에서 우리는 "다 배운 것이 아니라 지도를 손에 넣은 것"이라고 했다.
이제 그 지도를 들고 밖으로 나가 볼 차례다. 그리고 문을 열자마자 만나는 것이
주성분분석 (principal component analysis, PCA)이다.
읽는 사람 가운데 적지 않은 수가 이미 PCA를 쓰고 있을 것이다. 함수 하나를 부르면
100개짜리 좌표가 2개로 줄어든다. 그런데 그 한 줄이 무슨 일을 하는지 물으면 대개
여기까지다. “공분산행렬의 고유벡터를 구한다.”
그러면 왜 하필 공분산행렬 인가. 왜 하필 고유벡터인가. 그리고 이것이 이 강의의 진짜
물음인데, 실제 라이브러리를 열어 보면 공분산행렬을 아예 만들지 않는다.
데이터 행렬에 SVD를 바로 건다. 교과서가 시키는 대로 하지 않는 것이다. 왜인가.
세 물음의 답이 전부 지난 서른네 강의 안에 있다. 새로 배울 것은 하나도 없다.
데이터 구름에 자를 하나 대고 돌려 본다.
어느 각도에서 점들의 그림자가 가장 넓게 퍼지는가. 그 각도가 제1주성분이다.
PCA의 전부가 이 문장 하나다.
그리고 이 "돌려 보기"를 식으로 옮기면 레일리 몫 이 되고, 그 답은 L25의 스펙트럼
정리가 이미 쥐고 있다. 우리는 답을 먼저 배우고 문제를 나중에 만난 셈이다.
1. 문제를 정확히 적는다 ¶ 데이터 행렬 ¶ m m m 개의 표본을 각각 n n n 개의 변수로 재었다고 하자. 행 하나가 표본 하나이고, 열 하나가
변수 하나다.
X = [ — x 1 T — ⋮ — x m T — ] ∈ R m × n X =
\begin{bmatrix}
\text{---} & \vv{x}_1^{\mathsf T} & \text{---} \\
& \vdots & \\
\text{---} & \vv{x}_m^{\mathsf T} & \text{---}
\end{bmatrix}
\in \R^{m \times n} X = ⎣ ⎡ — — x 1 T ⋮ x m T — — ⎦ ⎤ ∈ R m × n (1) 의 배치를 L16과 헷갈리면 안 된다. 최소제곱에서 A A A 의 열은 "설명변수"였고
우변 b \vv{b} b 가 따로 있었다. 여기에는 우변이 없다. X X X 하나만 놓고 그 자체의 모양을
묻는다. 정답이 없는 문제라는 점에서 성격이 다르다.
중심화 ¶ 먼저 평균을 뺀다. 표본평균은 열마다 하나씩 나오므로 n n n 차원 벡터다.
μ = 1 m ∑ i = 1 m x i = 1 m X T 1 , X c = X − 1 μ T \boldsymbol{\mu} = \frac{1}{m}\sum_{i=1}^{m}\vv{x}_i = \frac{1}{m}X^{\mathsf T}\vv{1},
\qquad
X_c = X - \vv{1}\boldsymbol{\mu}^{\mathsf T} μ = m 1 i = 1 ∑ m x i = m 1 X T 1 , X c = X − 1 μ T (2) 의 1 \vv{1} 1 은 성분이 전부 1인 m m m 차원 벡터다. 1 μ T \vv{1}\boldsymbol{\mu}^{\mathsf T} 1 μ T
는 랭크 1 행렬이고(L11), 모든 행이 μ T \boldsymbol{\mu}^{\mathsf T} μ T 로 같다. 그것을 빼면 각 열의 합이
0이 된다.
이 뺄셈을 행렬 하나로 적을 수도 있다. μ T = 1 T X / m \boldsymbol{\mu}^{\mathsf T} = \vv{1}^{\mathsf T}X/m μ T = 1 T X / m 을
(2) 에 넣고 묶으면 이렇게 된다.
X c = X − 1 m 1 1 T X = ( I − 1 1 T m ) X X_c
= X - \frac{1}{m}\vv{1}\vv{1}^{\mathsf T}X
= \left(I - \frac{\vv{1}\vv{1}^{\mathsf T}}{m}\right)X X c = X − m 1 1 1 T X = ( I − m 1 1 T ) X (3) 의 괄호 안이 낯이 익을 것이다. 1 T 1 = m \vv{1}^{\mathsf T}\vv{1} = m 1 T 1 = m 이므로
1 1 T / m \vv{1}\vv{1}^{\mathsf T}/m 1 1 T / m 은 L15에서 배운 한 벡터로의 투영행렬 a a T / a T a \vv{a}\vv{a}^{\mathsf T}/\vv{a}^{\mathsf T}\vv{a} a a T / a T a
바로 그것이다. 따라서 I I I 에서 그것을 뺀 것은 1 \vv{1} 1 에 수직인 공간으로의 투영이다.
중심화는 투영이었다.
방향 하나에 자를 댄다 ¶ 단위벡터 v \vv{v} v 를 하나 골라 모든 점을 그 방향에 투영한다. 투영한 좌표를 모으면
벡터 하나가 나온다.
y = X c v , y i = v T x c , i , ∥ v ∥ = 1 \vv{y} = X_c\vv{v},
\qquad
y_i = \vv{v}^{\mathsf T}\vv{x}_{c,i},
\qquad
\lVert\vv{v}\rVert = 1 y = X c v , y i = v T x c , i , ∥ v ∥ = 1 (4) 의 y i y_i y i 가 표본 i i i 의 그림자 위치다. 중심화를 해 두었으므로
1 T y = 1 T X c v = 0 \vv{1}^{\mathsf T}\vv{y} = \vv{1}^{\mathsf T}X_c\vv{v} = 0 1 T y = 1 T X c v = 0 이고, 곧 y \vv{y} y 의 평균이 0이다.
평균이 0이면 표본분산은 제곱합을 m − 1 m-1 m − 1 로 나눈 것뿐이다.
Var ( y ) = 1 m − 1 ∑ i = 1 m y i 2 = ∥ X c v ∥ 2 m − 1 = v T ( X c T X c m − 1 ) v \operatorname{Var}(\vv{y})
= \frac{1}{m-1}\sum_{i=1}^{m} y_i^2
= \frac{\lVert X_c\vv{v}\rVert^2}{m-1}
= \vv{v}^{\mathsf T}\!\left(\frac{X_c^{\mathsf T}X_c}{m-1}\right)\!\vv{v} Var ( y ) = m − 1 1 i = 1 ∑ m y i 2 = m − 1 ∥ X c v ∥ 2 = v T ( m − 1 X c T X c ) v (5) 의 변형이 이 강의 전체의 열쇠다. ∥ X c v ∥ 2 = ( X c v ) T ( X c v ) = v T X c T X c v \lVert X_c\vv{v}\rVert^2 = (X_c\vv{v})^{\mathsf T}(X_c\vv{v})
= \vv{v}^{\mathsf T}X_c^{\mathsf T}X_c\vv{v} ∥ X c v ∥ 2 = ( X c v ) T ( X c v ) = v T X c T X c v 로 옮긴 것이 전부인데, 이 한 번의 이동으로
데이터에 관한 물음이 행렬 하나에 관한 물음으로 바뀐다. 가운데 괄호에 이름을 붙이자.
C = X c T X c m − 1 ( n × n 표본 공분산행렬 ) C = \frac{X_c^{\mathsf T}X_c}{m-1}
\qquad(n \times n \ \text{표본 공분산행렬}) C = m − 1 X c T X c ( n × n 표본 공분산행렬 ) (6) 의 C C C 는 대각선에 각 변수의 분산이, 그 밖에 변수 쌍의 공분산이 앉은
행렬이다. 그러나 지금 중요한 것은 통계적 이름이 아니라 C C C 가 X c T X c X_c^{\mathsf T}X_c X c T X c 꼴이라는
사실 이다. L27에서 이 꼴을 실컷 다루었다.
그래서 문제는 이것이다 ¶ max ∥ v ∥ = 1 v T C v \max_{\lVert\vv{v}\rVert = 1} \ \vv{v}^{\mathsf T}C\vv{v} ∥ v ∥ = 1 max v T C v (7) 의 문제를 푸는 v \vv{v} v 를 제1주성분 이라 부른다. 제약이 붙은
최적화처럼 보이지만 라그랑주 승수를 꺼낼 필요가 없다. 답은 이미 우리 손에 있다.
손으로 끝까지 따라갈 수 있는 작은 자료를 하나 쓴다. 다섯 개의 점을 두 변수로 잰 것이다.
X = [ 1 3 3 1 4 3 5 3 7 5 ] , μ = ( 4 , 3 ) , X c = [ − 3 0 − 1 − 2 0 0 1 0 3 2 ] X = \begin{bmatrix} 1 & 3 \\ 3 & 1 \\ 4 & 3 \\ 5 & 3 \\ 7 & 5 \end{bmatrix},
\qquad
\boldsymbol{\mu} = (4,\ 3),
\qquad
X_c = \begin{bmatrix} -3 & 0 \\ -1 & -2 \\ 0 & 0 \\ 1 & 0 \\ 3 & 2 \end{bmatrix} X = ⎣ ⎡ 1 3 4 5 7 3 1 3 3 5 ⎦ ⎤ , μ = ( 4 , 3 ) , X c = ⎣ ⎡ − 3 − 1 0 1 3 0 − 2 0 0 2 ⎦ ⎤ (8) 의 평균은 열의 합 1 + 3 + 4 + 5 + 7 = 20 1+3+4+5+7 = 20 1 + 3 + 4 + 5 + 7 = 20 과 3 + 1 + 3 + 3 + 5 = 15 3+1+3+3+5 = 15 3 + 1 + 3 + 3 + 5 = 15 를 각각 5로 나눈
것이다. 중심화한 열의 합이 − 3 − 1 + 0 + 1 + 3 = 0 -3-1+0+1+3 = 0 − 3 − 1 + 0 + 1 + 3 = 0 과 0 − 2 + 0 + 0 + 2 = 0 0-2+0+0+2 = 0 0 − 2 + 0 + 0 + 2 = 0 이라 제대로 되었다.
이제 C C C 를 만든다. 제곱합은 20 과 8 이고 교차합은 ( − 3 ) ( 0 ) + ( − 1 ) ( − 2 ) + 0 + 0 + ( 3 ) ( 2 ) = 8 (-3)(0)+(-1)(-2)+0+0+(3)(2) = 8 ( − 3 ) ( 0 ) + ( − 1 ) ( − 2 ) + 0 + 0 + ( 3 ) ( 2 ) = 8 이다.
X c T X c = [ 20 8 8 8 ] , C = 1 4 [ 20 8 8 8 ] = [ 5 2 2 2 ] X_c^{\mathsf T}X_c = \begin{bmatrix} 20 & 8 \\ 8 & 8 \end{bmatrix},
\qquad
C = \frac{1}{4}\begin{bmatrix} 20 & 8 \\ 8 & 8 \end{bmatrix}
= \begin{bmatrix} 5 & 2 \\ 2 & 2 \end{bmatrix} X c T X c = [ 20 8 8 8 ] , C = 4 1 [ 20 8 8 8 ] = [ 5 2 2 2 ] (9) 의 C C C 를 보면 첫 변수의 분산이 5, 둘째가 2, 둘의 공분산이 2다.
m − 1 = 4 m-1 = 4 m − 1 = 4 로 나눈 것에 주의하자. m m m 으로 나누는 유파도 있는데, 그러면 모든 고윳값이
같은 비율로 줄어들 뿐이라 주성분의 방향은 달라지지 않는다.
Figure 1: 왼쪽은 평균을 빼는 단계, 가운데는 방향 하나에 그림자를 떨어뜨린 모습, 오른쪽은
자를 0도에서 180도까지 돌리며 잰 분산이다. 가장 좋은 각도와 가장 나쁜 각도가
정확히 90도 떨어져 있고, 두 값의 합이 대각합 7이다.
2. 레일리 몫 — 답은 L25와 L27에 이미 있었다 ¶ 레일리 몫 ¶ ∥ v ∥ = 1 \lVert\vv{v}\rVert = 1 ∥ v ∥ = 1 이라는 제약이 거추장스러우니 분모로 옮긴다.
R ( v ) = v T C v v T v R(\vv{v}) = \frac{\vv{v}^{\mathsf T}C\vv{v}}{\vv{v}^{\mathsf T}\vv{v}} R ( v ) = v T v v T C v (10) 의 몫을 레일리 몫 이라 한다. v \vv{v} v 를 c c c 배 해도 분자와 분모가
똑같이 c 2 c^2 c 2 배가 되므로 값이 변하지 않는다. 곧 길이는 상관없고 방향만 상관있다.
그래서 R R R 을 최대로 하는 것과 (7) 의 문제를 푸는 것이 같은 일이다.
C C C 는 대칭이고 준정부호다¶ C C C 에 대해 우리가 아는 것을 먼저 적어 두자. 전치를 취하면
( X c T X c ) T = X c T X c (X_c^{\mathsf T}X_c)^{\mathsf T} = X_c^{\mathsf T}X_c ( X c T X c ) T = X c T X c 이므로 대칭 이다. 에너지를 계산하면
(5) 의 식이 그대로 답이다.
v T C v = ∥ X c v ∥ 2 m − 1 ≥ 0 \vv{v}^{\mathsf T}C\vv{v} = \frac{\lVert X_c\vv{v}\rVert^2}{m-1} \ \ge\ 0 v T C v = m − 1 ∥ X c v ∥ 2 ≥ 0 (11) 의 부등식이 양의 준정부호 의 정의다(L27). 등호는 X c v = 0 X_c\vv{v} = \vv{0} X c v = 0
일 때만 성립하므로, 변수들이 서로 독립이면 양의 정부호가 되고 그렇지 않으면 고윳값 0이
생긴다. 어느 쪽이든 고윳값이 음수가 되는 일은 없다. 분산이 음수일 수 없다는 상식이
행렬의 언어로 적힌 것이다.
스펙트럼 정리를 끼워 넣는다 ¶ 대칭행렬이므로 L25가 곧바로 쓰인다.
C = Q Λ Q T , Q T Q = I , λ 1 ≥ λ 2 ≥ ⋯ ≥ λ n ≥ 0 C = Q\Lambda Q^{\mathsf T},
\qquad
Q^{\mathsf T}Q = I,
\qquad
\lambda_1 \ge \lambda_2 \ge \cdots \ge \lambda_n \ge 0 C = Q Λ Q T , Q T Q = I , λ 1 ≥ λ 2 ≥ ⋯ ≥ λ n ≥ 0 (12) 의 분해에서 Q Q Q 의 열 q 1 , … , q n \vv{q}_1, \dots, \vv{q}_n q 1 , … , q n 은 정규직교 이고
고윳값은 전부 실수다. 준정부호이므로 음수도 없다. 이 두 가지가 아래 계산을 전부
가능하게 한다.
Q Q Q 의 열이 R n \R^n R n 의 기저이므로 아무 v \vv{v} v 나 v = Q w \vv{v} = Q\vv{w} v = Q w 로 적을 수 있다.
w \vv{w} w 는 v \vv{v} v 를 고유벡터 기저에서 본 좌표다(L31). 이것을 (10) 에
넣는다.
R ( Q w ) = w T Q T Q Λ Q T Q w w T Q T Q w = w T Λ w w T w = ∑ i λ i w i 2 ∑ i w i 2 R(Q\vv{w})
= \frac{\vv{w}^{\mathsf T}Q^{\mathsf T}\,Q\Lambda Q^{\mathsf T}\,Q\vv{w}}
{\vv{w}^{\mathsf T}Q^{\mathsf T}Q\vv{w}}
= \frac{\vv{w}^{\mathsf T}\Lambda\vv{w}}{\vv{w}^{\mathsf T}\vv{w}}
= \frac{\sum_{i} \lambda_i w_i^2}{\sum_{i} w_i^2} R ( Q w ) = w T Q T Q w w T Q T Q Λ Q T Q w = w T w w T Λ w = ∑ i w i 2 ∑ i λ i w i 2 (13) 의 계산에서 한 일은 Q T Q = I Q^{\mathsf T}Q = I Q T Q = I 를 두 번 지운 것뿐이다.
분자에서 가운데의 Q T Q Q^{\mathsf T}Q Q T Q 가 사라져 Λ \Lambda Λ 만 남고, 분모에서도 마찬가지다.
직교행렬은 길이를 바꾸지 않으므로 (L17) 분모가 그대로 ∥ w ∥ 2 \lVert\vv{w}\rVert^2 ∥ w ∥ 2 인 것이다.
최대값 ¶ (13) 의 오른쪽을 다시 보자. t i = w i 2 / ∑ j w j 2 t_i = w_i^2 / \sum_j w_j^2 t i = w i 2 / ∑ j w j 2 로 두면
t i ≥ 0 t_i \ge 0 t i ≥ 0 이고 ∑ i t i = 1 \sum_i t_i = 1 ∑ i t i = 1 이다.
R = ∑ i = 1 n λ i t i , t i ≥ 0 , ∑ i = 1 n t i = 1 R = \sum_{i=1}^{n}\lambda_i t_i,
\qquad
t_i \ge 0,
\qquad
\sum_{i=1}^{n} t_i = 1 R = i = 1 ∑ n λ i t i , t i ≥ 0 , i = 1 ∑ n t i = 1 (14) 의 오른쪽은 고윳값들의 가중평균 이다. 가중치를 어떻게 나누어 주든
평균이 최대값을 넘을 수는 없고 최소값 아래로 내려갈 수도 없다.
λ n ≤ R ( v ) ≤ λ 1 \lambda_n \ \le\ R(\vv{v}) \ \le\ \lambda_1 λ n ≤ R ( v ) ≤ λ 1 (15) 의 두 부등식에서 위쪽 등호는 t 1 = 1 t_1 = 1 t 1 = 1 일 때, 곧 w = e 1 \vv{w} = \vv{e}_1 w = e 1 이고
v = Q e 1 = q 1 \vv{v} = Q\vv{e}_1 = \vv{q}_1 v = Q e 1 = q 1 일 때만 성립한다. 라그랑주 승수도 미분도 쓰지 않았다.
정규직교 기저로 갈아 끼운 것이 증명의 전부다.
두 번째 주성분은 직교가 공짜다 ¶ 제1주성분을 찾았으니 그다음을 찾는다. 같은 방향을 또 고르면 새로운 정보가 없으므로
q 1 \vv{q}_1 q 1 에 수직인 방향 중에서 고른다.
v ⊥ q 1 ⟺ w 1 = q 1 T v = 0 ⟹ R = ∑ i ≥ 2 λ i w i 2 ∑ i ≥ 2 w i 2 ≤ λ 2 \vv{v} \perp \vv{q}_1
\ \Longleftrightarrow\
w_1 = \vv{q}_1^{\mathsf T}\vv{v} = 0
\ \Longrightarrow\
R = \frac{\sum_{i \ge 2}\lambda_i w_i^2}{\sum_{i \ge 2} w_i^2} \ \le\ \lambda_2 v ⊥ q 1 ⟺ w 1 = q 1 T v = 0 ⟹ R = ∑ i ≥ 2 w i 2 ∑ i ≥ 2 λ i w i 2 ≤ λ 2 (16) 의 첫 동치가 요령이다. v = Q w \vv{v} = Q\vv{w} v = Q w 이므로 q 1 T v \vv{q}_1^{\mathsf T}\vv{v} q 1 T v
가 곧 w 1 w_1 w 1 이고, q 1 \vv{q}_1 q 1 에 수직이라는 것은 첫 좌표를 버린다는 뜻이다. 그러면 남은
합에서 (15) 의 논증을 그대로 되풀이하면 되고, 최대값은 λ 2 \lambda_2 λ 2 이며
v = q 2 \vv{v} = \vv{q}_2 v = q 2 에서 달성된다.
앵커로 확인 ¶ (9) 의 C C C 에 특성방정식을 세운다(L21).
det ( C − λ I ) = ( 5 − λ ) ( 2 − λ ) − 4 = λ 2 − 7 λ + 6 = ( λ − 6 ) ( λ − 1 ) \det(C - \lambda I)
= (5-\lambda)(2-\lambda) - 4
= \lambda^2 - 7\lambda + 6
= (\lambda - 6)(\lambda - 1) det ( C − λ I ) = ( 5 − λ ) ( 2 − λ ) − 4 = λ 2 − 7 λ + 6 = ( λ − 6 ) ( λ − 1 ) (17) 에서 λ 1 = 6 \lambda_1 = 6 λ 1 = 6 , λ 2 = 1 \lambda_2 = 1 λ 2 = 1 이 나온다. λ = 6 \lambda = 6 λ = 6 을
C − λ I C - \lambda I C − λ I 에 넣으면 첫 행이 − x + 2 y = 0 -x + 2y = 0 − x + 2 y = 0 이므로 x = 2 y x = 2y x = 2 y 이고, λ = 1 \lambda = 1 λ = 1 을 넣으면
첫 행이 4 x + 2 y = 0 4x + 2y = 0 4 x + 2 y = 0 이므로 y = − 2 x y = -2x y = − 2 x 다.
q 1 = 1 5 [ 2 1 ] , q 2 = 1 5 [ − 1 2 ] , q 1 T q 2 = − 2 + 2 5 = 0 \vv{q}_1 = \frac{1}{\sqrt5}\begin{bmatrix} 2 \\ 1 \end{bmatrix},
\qquad
\vv{q}_2 = \frac{1}{\sqrt5}\begin{bmatrix} -1 \\ 2 \end{bmatrix},
\qquad
\vv{q}_1^{\mathsf T}\vv{q}_2 = \frac{-2+2}{5} = 0 q 1 = 5 1 [ 2 1 ] , q 2 = 5 1 [ − 1 2 ] , q 1 T q 2 = 5 − 2 + 2 = 0 (18) 의 두 벡터가 정말 수직이다. 제1주성분의 기울기는 1 / 2 1/2 1/2 이고 각도는
arctan ( 1 / 2 ) = 26.56 5 ∘ \arctan(1/2) = 26.565^\circ arctan ( 1/2 ) = 26.56 5 ∘ 다. Figure 1 의 오른쪽 그림에서 봉우리가
바로 이 자리에 있고, 골짜기는 116.56 5 ∘ 116.565^\circ 116.56 5 ∘ 에 있다.
대각합이 총분산이다 ¶ 마지막으로 하나 더. 대각합은 고윳값의 합이었다(L21).
λ 1 + ⋯ + λ n = tr C = ∑ j = 1 n C j j \lambda_1 + \cdots + \lambda_n = \tr C = \sum_{j=1}^{n} C_{jj} λ 1 + ⋯ + λ n = tr C = j = 1 ∑ n C jj (19) 의 오른쪽은 각 변수의 분산을 그냥 더한 것이다. 앵커에서는
5 + 2 = 7 5 + 2 = 7 5 + 2 = 7 이고 왼쪽은 6 + 1 = 7 6 + 1 = 7 6 + 1 = 7 이다. 좌표를 아무리 돌려도 총분산은 보존된다.
회전은 길이를 바꾸지 않으니 당연한데, 이 당연함이 다음 절에서 "설명분산 비율"의
분모가 된다.
Figure 2: 왼쪽은 모든 방향에서 v T C v \vv{v}^{\mathsf T}C\vv{v} v T C v 를 재어 그 값만큼 뻗은 그림이다.
가장 멀리 뻗은 곳이 q 1 \vv{q}_1 q 1 이고 그 길이가 6이다. 오른쪽은 같은 정보를 타원으로
그린 것으로, 반축의 길이가 λ i \sqrt{\lambda_i} λ i 다.
3. 공분산을 거치지 않는 길 ¶ SVD 하나면 된다 ¶ 여기까지가 교과서의 이야기다. 그런데 C C C 를 만들지 않고도 같은 답을 얻을 수 있다.
X c X_c X c 에 바로 SVD를 걸면 된다(L29).
X c = U Σ V T , U T U = I , V T V = I X_c = U\Sigma V^{\mathsf T},
\qquad
U^{\mathsf T}U = I,
\qquad
V^{\mathsf T}V = I X c = U Σ V T , U T U = I , V T V = I (20) 의 분해를 (6) 에 그대로 넣어 보자. 가운데에서 U T U U^{\mathsf T}U U T U 가
I I I 로 사라진다.
C = X c T X c m − 1 = V Σ T U T U ⏟ = I Σ V T m − 1 = V ( Σ T Σ m − 1 ) V T C = \frac{X_c^{\mathsf T}X_c}{m-1}
= \frac{V\Sigma^{\mathsf T}\underbrace{U^{\mathsf T}U}_{=\,I}\Sigma V^{\mathsf T}}{m-1}
= V\!\left(\frac{\Sigma^{\mathsf T}\Sigma}{m-1}\right)\!V^{\mathsf T} C = m − 1 X c T X c = m − 1 V Σ T = I U T U Σ V T = V ( m − 1 Σ T Σ ) V T (21) 의 오른쪽은 대각행렬을 직교행렬로 감싼 꼴이니 그 자체가 스펙트럼 분해다.
(12) 의 식과 견주면 대응이 한눈에 보인다.
Q = V , Λ = Σ T Σ m − 1 , λ i = σ i 2 m − 1 Q = V,
\qquad
\Lambda = \frac{\Sigma^{\mathsf T}\Sigma}{m-1},
\qquad
\lambda_i = \frac{\sigma_i^2}{m-1} Q = V , Λ = m − 1 Σ T Σ , λ i = m − 1 σ i 2 (22) 의 대응이 이 절의 결론이다. V V V 의 열이 주성분이고, 고윳값은
특이값의 제곱을 m − 1 m-1 m − 1 로 나눈 것이다. 공분산행렬은 한 번도 만들지 않았다.
각 표본이 새 좌표계에서 어디에 있는지도 공짜로 나온다. (4) 의 계산을
모든 주성분에 대해 한꺼번에 하면 이렇다.
Y = X c V = U Σ V T V = U Σ Y = X_c V = U\Sigma V^{\mathsf T}V = U\Sigma Y = X c V = U Σ V T V = U Σ (23) 의 Y Y Y 를 주성분 점수 라 한다. U U U 의 열에 σ i \sigma_i σ i 를 곱한 것이
전부이므로 따로 곱셈을 할 필요조차 없다. 그리고 Y T Y = Σ T Σ Y^{\mathsf T}Y = \Sigma^{\mathsf T}\Sigma Y T Y = Σ T Σ
가 대각행렬이므로 새 좌표들은 서로 상관이 0이다. 뒤엉켜 있던 변수를 풀어 놓는
것이 PCA가 하는 일이다.
(8) 의 X c X_c X c 에 특이값을 재면 σ i 2 \sigma_i^2 σ i 2 가 X c T X c X_c^{\mathsf T}X_c X c T X c 의 고윳값이므로,
(9) 의 행렬에서 곧바로 얻어진다. 그 행렬은 4 C 4C 4 C 이고 고윳값이 24 와 4 다.
σ 1 = 24 = 2 6 ≈ 4.8990 , σ 2 = 2 , σ 1 2 4 = 6 , σ 2 2 4 = 1 \sigma_1 = \sqrt{24} = 2\sqrt6 \approx 4.8990,
\qquad
\sigma_2 = 2,
\qquad
\frac{\sigma_1^2}{4} = 6,
\qquad
\frac{\sigma_2^2}{4} = 1 σ 1 = 24 = 2 6 ≈ 4.8990 , σ 2 = 2 , 4 σ 1 2 = 6 , 4 σ 2 2 = 1 (24) 의 마지막 두 값이 (17) 에서 구한 고윳값과 같다.
두 길이 같은 곳에 닿았다. 그러면 왜 굳이 SVD를 쓰는가. 5절이 그 답이다.
4. 설명분산은 L29의 에너지다 ¶ 주성분을 몇 개까지 남길지 정해야 한다. 기준으로 흔히 쓰는 것이 설명분산 비율 이다.
p i = λ i λ 1 + ⋯ + λ n = σ i 2 σ 1 2 + ⋯ + σ n 2 p_i = \frac{\lambda_i}{\lambda_1 + \cdots + \lambda_n}
= \frac{\sigma_i^2}{\sigma_1^2 + \cdots + \sigma_n^2} p i = λ 1 + ⋯ + λ n λ i = σ 1 2 + ⋯ + σ n 2 σ i 2 (25) 의 두 번째 등식은 분자와 분모에서 m − 1 m-1 m − 1 이 함께 지워지기 때문에
성립한다. 그래서 설명분산 비율을 계산할 때는 m − 1 m-1 m − 1 이든 m m m 이든 상관이 없다.
앵커에서는 p 1 = 6 / 7 ≈ 0.857 p_1 = 6/7 \approx 0.857 p 1 = 6/7 ≈ 0.857 , p 2 = 1 / 7 ≈ 0.143 p_2 = 1/7 \approx 0.143 p 2 = 1/7 ≈ 0.143 이다.
그런데 오른쪽 표현을 L29에서 본 적이 있다. 거기서는 σ i 2 \sigma_i^2 σ i 2 를 에너지 라 불렀고
∑ σ i 2 = ∥ X c ∥ F 2 \sum\sigma_i^2 = \lVert X_c\rVert_F^2 ∑ σ i 2 = ∥ X c ∥ F 2 였다. 이름만 다르지 같은 수다.
에크하르트-영 ¶ 같은 수인 이유가 있다. L29의 에크하르트-영 정리는 랭크 k k k 로 근사할 때의 최소 오차를
알려주었다.
min rank B = k ∥ X c − B ∥ F 2 = ∑ i > k σ i 2 , B ⋆ = ∑ i ≤ k σ i u i v i T \min_{\rank B \,=\, k}\lVert X_c - B\rVert_F^2 = \sum_{i > k}\sigma_i^2,
\qquad
B^{\star} = \sum_{i \le k}\sigma_i\vv{u}_i\vv{v}_i^{\mathsf T} rank B = k min ∥ X c − B ∥ F 2 = i > k ∑ σ i 2 , B ⋆ = i ≤ k ∑ σ i u i v i T (26) 의 최적해 B ⋆ B^{\star} B ⋆ 가 바로 "주성분 k k k 개만 남긴 것"이다. 양변을
∥ X c ∥ F 2 \lVert X_c\rVert_F^2 ∥ X c ∥ F 2 로 나누면 (25) 의 비율이 나온다.
∥ X c − B ⋆ ∥ F 2 ∥ X c ∥ F 2 = ∑ i > k σ i 2 ∑ i σ i 2 = 1 − ∑ i ≤ k p i \frac{\lVert X_c - B^{\star}\rVert_F^2}{\lVert X_c\rVert_F^2}
= \frac{\sum_{i>k}\sigma_i^2}{\sum_{i}\sigma_i^2}
= 1 - \sum_{i \le k} p_i ∥ X c ∥ F 2 ∥ X c − B ⋆ ∥ F 2 = ∑ i σ i 2 ∑ i > k σ i 2 = 1 − i ≤ k ∑ p i (27) 의 등식이 두 세계를 잇는다. 왼쪽은 "복원 오차"이고 오른쪽은
"설명하지 못한 분산"인데 같은 수다. 그래서 "주성분 3개로 97%를 설명한다"는 말과
"랭크 3으로 근사하면 에너지의 97%가 남는다"는 말은 완전히 같은 말이다.
Figure 3: 왼쪽은 10개 변수로 잰 합성 자료의 스크리 도표다. 앞 세 개가 97%를 차지하고 나머지는
거의 평평한데, 자료를 만들 때 실제로 쓴 방향이 3개였다. 오른쪽은 랭크 k k k 로 실제
복원해 잰 오차와 설명분산으로 예측한 값을 겹쳐 그린 것이다. 두 곡선이 하나다.
5. 공분산을 만들면 조건수가 제곱된다 ¶ 이 강의를 한 문장으로 줄이면 이 절이다.
제곱된다 ¶ C C C 의 고윳값이 σ i 2 / ( m − 1 ) \sigma_i^2/(m-1) σ i 2 / ( m − 1 ) 이므로 조건수를 계산하면 m − 1 m-1 m − 1 이 지워진다.
κ ( C ) = λ 1 λ n = σ 1 2 / ( m − 1 ) σ n 2 / ( m − 1 ) = ( σ 1 σ n ) 2 = κ ( X c ) 2 \kappa(C)
= \frac{\lambda_1}{\lambda_n}
= \frac{\sigma_1^2/(m-1)}{\sigma_n^2/(m-1)}
= \left(\frac{\sigma_1}{\sigma_n}\right)^{\!2}
= \kappa(X_c)^2 κ ( C ) = λ n λ 1 = σ n 2 / ( m − 1 ) σ 1 2 / ( m − 1 ) = ( σ n σ 1 ) 2 = κ ( X c ) 2 (28) 의 등식은 L33에서 이미 만났다. 그때는 최소제곱의 정규방정식이 문제였고
지금은 PCA다. 문제는 다르지만 죄목은 같다. X T X X^{\mathsf T}X X T X 라는 곱을 손으로 만든 것이다.
앵커로도 확인된다. κ ( X c ) = σ 1 / σ 2 = 2 6 / 2 = 6 ≈ 2.449 \kappa(X_c) = \sigma_1/\sigma_2 = 2\sqrt6/2 = \sqrt6 \approx 2.449 κ ( X c ) = σ 1 / σ 2 = 2 6 /2 = 6 ≈ 2.449 이고
κ ( C ) = 6 / 1 = 6 \kappa(C) = 6/1 = 6 κ ( C ) = 6/1 = 6 이다. 정확히 제곱이다.
얼마나 손해인가 ¶ 제곱이 왜 문제인지 자릿수로 따져 보자. 고윳값 계산에서 생기는 오차는 가장 큰 고윳값에
비례한다. 곧 ∣ d λ i ∣ ≲ ϵ mach λ 1 \lvert d\lambda_i\rvert \lesssim \epsilon_{\text{mach}}\lambda_1 ∣ d λ i ∣ ≲ ϵ mach λ 1 이다.
우리가 원하는 것은 σ i \sigma_i σ i 이므로 σ i = λ i \sigma_i = \sqrt{\lambda_i} σ i = λ i 를 미분한다.
σ i = λ i 1 / 2 ⟹ d σ i σ i = 1 2 ⋅ d λ i λ i \sigma_i = \lambda_i^{1/2}
\qquad\Longrightarrow\qquad
\frac{d\sigma_i}{\sigma_i} = \frac{1}{2}\cdot\frac{d\lambda_i}{\lambda_i} σ i = λ i 1/2 ⟹ σ i d σ i = 2 1 ⋅ λ i d λ i (29) 의 관계는 d σ i = 1 2 λ i − 1 / 2 d λ i d\sigma_i = \tfrac12\lambda_i^{-1/2}d\lambda_i d σ i = 2 1 λ i − 1/2 d λ i 를
σ i = λ i 1 / 2 \sigma_i = \lambda_i^{1/2} σ i = λ i 1/2 로 나눈 것이다. 여기에 오차의 크기를 넣는다.
∣ d σ i ∣ σ i ≲ ϵ mach 2 ⋅ λ 1 λ i = ϵ mach 2 ( σ 1 σ i ) 2 ≤ ϵ mach κ ( X c ) 2 2 \frac{\lvert d\sigma_i\rvert}{\sigma_i}
\ \lesssim\ \frac{\epsilon_{\text{mach}}}{2}\cdot\frac{\lambda_1}{\lambda_i}
= \frac{\epsilon_{\text{mach}}}{2}\left(\frac{\sigma_1}{\sigma_i}\right)^{\!2}
\ \le\ \frac{\epsilon_{\text{mach}}\,\kappa(X_c)^2}{2} σ i ∣ d σ i ∣ ≲ 2 ϵ mach ⋅ λ i λ 1 = 2 ϵ mach ( σ i σ 1 ) 2 ≤ 2 ϵ mach κ ( X c ) 2 (30) 의 마지막 항이 손해의 크기다. 반면 X c X_c X c 에 직접 SVD를 걸면 특이값의
오차는 σ 1 \sigma_1 σ 1 에 비례할 뿐 제곱이 끼어들지 않는다.
∣ d σ i ∣ σ i ≲ ϵ mach ⋅ σ 1 σ i ≤ ϵ mach κ ( X c ) \frac{\lvert d\sigma_i\rvert}{\sigma_i}
\ \lesssim\ \epsilon_{\text{mach}}\cdot\frac{\sigma_1}{\sigma_i}
\ \le\ \epsilon_{\text{mach}}\,\kappa(X_c) σ i ∣ d σ i ∣ ≲ ϵ mach ⋅ σ i σ 1 ≤ ϵ mach κ ( X c ) (31) 의 지수와 (30) 의 지수가 1과 2로 갈린다.
κ = 1 0 6 \kappa = 10^6 κ = 1 0 6 이면 앞의 것은 10-10 이고 뒤의 것은 10-4 다. 여섯 자리가 날아간다.
갈리는 지점 ¶ 배정밀도에서 ϵ mach ≈ 2.2 × 1 0 − 16 \epsilon_{\text{mach}} \approx 2.2\times10^{-16} ϵ mach ≈ 2.2 × 1 0 − 16 이다.
κ ( X c ) = 1 0 8 ⟹ κ ( C ) = 1 0 16 > 1 ϵ mach ≈ 4.5 × 1 0 15 \kappa(X_c) = 10^{8}
\qquad\Longrightarrow\qquad
\kappa(C) = 10^{16} \ >\ \frac{1}{\epsilon_{\text{mach}}} \approx 4.5\times10^{15} κ ( X c ) = 1 0 8 ⟹ κ ( C ) = 1 0 16 > ϵ mach 1 ≈ 4.5 × 1 0 15 (32) 의 지점을 넘으면 λ n \lambda_n λ n 이 반올림 오차에 묻힌다. 그 결과가
꽤 사납다. 양의 준정부호 행렬인데 고윳값이 음수로 나온다. 수학적으로 불가능한 일이
계산에서는 일어나고, 그 뒤에 λ n \sqrt{\lambda_n} λ n 을 하려 들면 그대로 무너진다.
실제로 재어 보면 이렇게 갈린다. 특이값을 아는 400 × 8 400 \times 8 400 × 8 자료를 만들어 가장 작은
특이값을 얼마나 정확히 되찾는지 본 것이다.
κ ( X c ) \kappa(X_c) κ ( X c ) κ ( C ) \kappa(C) κ ( C ) 공분산 경유 SVD 직접 102 104 1.8 × 1 0 − 13 1.8\times10^{-13} 1.8 × 1 0 − 13 1.7 × 1 0 − 16 1.7\times10^{-16} 1.7 × 1 0 − 16 104 108 5.6 × 1 0 − 10 5.6\times10^{-10} 5.6 × 1 0 − 10 9.2 × 1 0 − 14 9.2\times10^{-14} 9.2 × 1 0 − 14 106 1012 2.6 × 1 0 − 5 2.6\times10^{-5} 2.6 × 1 0 − 5 7.8 × 1 0 − 13 7.8\times10^{-13} 7.8 × 1 0 − 13 108 7.6 × 1 0 15 7.6\times10^{15} 7.6 × 1 0 15 1.4 × 1 0 − 1 \mathbf{1.4\times10^{-1}} 1.4 × 1 0 − 1 1.1 × 1 0 − 12 1.1\times10^{-12} 1.1 × 1 0 − 12 1010 1.8 × 1 0 17 1.8\times10^{17} 1.8 × 1 0 17 1.0 \mathbf{1.0} 1.0 (고윳값이 음수)2.7 × 1 0 − 8 2.7\times10^{-8} 2.7 × 1 0 − 8
마지막 줄에서 공분산 경유의 상대오차가 1.0이다. 100% 틀렸다는 뜻이다.
같은 자료에서 SVD는 여덟 자리를 지키고 있다.
Figure 4: 왼쪽에서 실측한 κ ( C ) \kappa(C) κ ( C ) 가 κ ( X c ) 2 \kappa(X_c)^2 κ ( X c ) 2 위에 정확히 올라앉다가, 초록 선
1 / ϵ mach 1/\epsilon_{\text{mach}} 1/ ϵ mach 를 넘는 순간부터 의미를 잃고 흩어진다. 오른쪽에서 빨간 점은
ϵ κ 2 \epsilon\kappa^2 ϵ κ 2 를 따라 올라가고 파란 점은 ϵ κ \epsilon\kappa ϵ κ 를 따라간다.
단정밀도면 훨씬 빨리 온다 ¶ 기계학습에서 흔히 쓰는 float32 는 ϵ mach ≈ 1.2 × 1 0 − 7 \epsilon_{\text{mach}} \approx 1.2\times10^{-7} ϵ mach ≈ 1.2 × 1 0 − 7 이다.
(32) 의 계산을 다시 하면 임계점이 이렇게 내려온다.
1 ϵ mach = 1 1.19 × 1 0 − 7 ≈ 2900 ≈ 1 0 3.5 \frac{1}{\sqrt{\epsilon_{\text{mach}}}}
= \frac{1}{\sqrt{1.19\times10^{-7}}}
\approx 2900
\approx 10^{3.5} ϵ mach 1 = 1.19 × 1 0 − 7 1 ≈ 2900 ≈ 1 0 3.5 (33) 의 값은 배정밀도의 108 보다 네 자리 넘게 낮다.
200 × 2 200 \times 2 200 × 2 자료에서 σ 1 = 1 \sigma_1 = 1 σ 1 = 1 로 고정하고 σ 2 \sigma_2 σ 2 만 낮춰 가며 재 보면
경계가 정확히 그 자리에 있다.
κ ( X c ) \kappa(X_c) κ ( X c ) 공분산 경유 상대오차 SVD 직접 103 1.0033 × 1 0 − 3 1.0033\times10^{-3} 1.0033 × 1 0 − 3 0.3 % 0.3\% 0.3% 1.0000 × 1 0 − 3 1.0000\times10^{-3} 1.0000 × 1 0 − 3 3 × 1 0 3 3\times10^{3} 3 × 1 0 3 2.9369 × 1 0 − 4 2.9369\times10^{-4} 2.9369 × 1 0 − 4 2.1 % 2.1\% 2.1% 3.0000 × 1 0 − 4 3.0000\times10^{-4} 3.0000 × 1 0 − 4 104 0 \mathbf{0} 0 100 % \mathbf{100\%} 100% 1.0000 × 1 0 − 4 1.0000\times10^{-4} 1.0000 × 1 0 − 4
마지막 줄에서 λ 2 \lambda_2 λ 2 가 반올림에 통째로 묻혀 0이 되었다. 그 뒤에 제곱근을 씌우면
0 = 0 \sqrt0 = 0 0 = 0 이라 제2주성분의 크기가 0으로 보고된다. 조건수 104 는 실무에서
드물지도 않은 값이다.
sklearn.decomposition.PCA 도, R의 prcomp 도 데이터 행렬에 직접 SVD를 건다.
np.cov 를 만들어 eigh 를 거는 코드를 손으로 쓰면 입력을 자기 손으로 두 배 나쁘게
만든 뒤 푸는 것 이다.
이것이 이 책에서 같은 교훈이 나오는 다섯 번째 다. 크래머 공식(L20), 여인수
전개(L19), 조르당 형(L28), 정규방정식(L33), 그리고 공분산행렬. 이쯤 되면 예외가 아니라
규칙이다. 옳은 공식과 쓰는 공식은 다르다.
변수 수 n n n 이 표본 수 m m m 보다 훨씬 작으면 n × n n \times n n × n 행렬을 다루는 편이 싸다.
X c X_c X c 의 SVD는 O ( m n 2 ) O(mn^2) O ( m n 2 ) 인데 C C C 를 만드는 것도 O ( m n 2 ) O(mn^2) O ( m n 2 ) 이라 사실 큰 차이는 없지만,
자료를 조각으로 나누어 흘려 보내며 C C C 를 누적할 수 있다는 장점은 있다.
조건수가 넉넉할 때만 그렇게 하고, 잴 수 있으면 반드시 재 보라.
6. 중심화를 빼먹으면 ¶ 항등식 하나 ¶ 평균을 빼지 않고 X T X X^{\mathsf T}X X T X 를 만들면 무슨 일이 생기는지는 식으로 정확히 알 수 있다.
(2) 에서 X = X c + 1 μ T X = X_c + \vv{1}\boldsymbol{\mu}^{\mathsf T} X = X c + 1 μ T 이므로 그대로 전개한다.
X T X = X c T X c + X c T 1 μ T + μ 1 T X c + μ 1 T 1 μ T X^{\mathsf T}X
= X_c^{\mathsf T}X_c
+ X_c^{\mathsf T}\vv{1}\boldsymbol{\mu}^{\mathsf T}
+ \boldsymbol{\mu}\vv{1}^{\mathsf T}X_c
+ \boldsymbol{\mu}\vv{1}^{\mathsf T}\vv{1}\boldsymbol{\mu}^{\mathsf T} X T X = X c T X c + X c T 1 μ T + μ 1 T X c + μ 1 T 1 μ T (34) 의 네 항 가운데 가운데 둘이 사라진다. 중심화의 뜻이
X c T 1 = 0 X_c^{\mathsf T}\vv{1} = \vv{0} X c T 1 = 0 이기 때문이다. 그리고 1 T 1 = m \vv{1}^{\mathsf T}\vv{1} = m 1 T 1 = m 이므로
마지막 항이 정리된다.
X T X = X c T X c + m μ μ T X^{\mathsf T}X = X_c^{\mathsf T}X_c + m\,\boldsymbol{\mu}\boldsymbol{\mu}^{\mathsf T} X T X = X c T X c + m μ μ T (35) 의 항등식이 이 절의 전부다. 중심화를 빼먹는다는 것은
랭크 1 행렬 하나를 얹은 채로 푸는 것 이다. 앵커로 검산해 보면
X T X = ( 100 68 68 53 ) X^{\mathsf T}X = \begin{pmatrix}100 & 68\\ 68 & 53\end{pmatrix} X T X = ( 100 68 68 53 ) 이고
X c T X c + 5 μ μ T X_c^{\mathsf T}X_c + 5\boldsymbol{\mu}\boldsymbol{\mu}^{\mathsf T} X c T X c + 5 μ μ T 도 같은 행렬이다.
얹힌 항이 무엇을 하는가 ¶ 얹힌 항의 레일리 몫을 계산해 보자.
v T X T X v = ∥ X c v ∥ 2 + m ( μ T v ) 2 \vv{v}^{\mathsf T}X^{\mathsf T}X\vv{v}
= \lVert X_c\vv{v}\rVert^2 + m\left(\boldsymbol{\mu}^{\mathsf T}\vv{v}\right)^2 v T X T X v = ∥ X c v ∥ 2 + m ( μ T v ) 2 (36) 의 둘째 항은 v \vv{v} v 가 μ \boldsymbol{\mu} μ 방향일 때 m ∥ μ ∥ 2 m\lVert\boldsymbol{\mu}\rVert^2 m ∥ μ ∥ 2
로 최대가 되고, μ \boldsymbol{\mu} μ 에 수직일 때 0이 된다. 곧 평균 방향에만 m ∥ μ ∥ 2 m\lVert\boldsymbol{\mu}\rVert^2 m ∥ μ ∥ 2
크기의 가짜 분산이 얹힌다.
그러면 승부는 뻔하다. 진짜 퍼짐의 크기는 λ 1 \lambda_1 λ 1 정도인데 얹힌 것은
m ∥ μ ∥ 2 m\lVert\boldsymbol{\mu}\rVert^2 m ∥ μ ∥ 2 이고, 표본이 많을수록 m m m 이 커진다.
∥ μ ∥ \lVert\boldsymbol{\mu}\rVert ∥ μ ∥ 가 퍼짐보다 크기만 하면 제1주성분은 평균 방향으로 끌려간다.
평균이 ( 8 , 8 ) (8, 8) ( 8 , 8 ) 이고 퍼짐은 그것과 수직인 방향인 자료 300개를 만들어 재어 보았다.
제1주성분 특이값 설명분산 비율 중심화함 ( 0.707 , − 0.707 ) (0.707,\ -0.707) ( 0.707 , − 0.707 ) 50.6 , 8.5 50.6,\ 8.5 50.6 , 8.5 97.3 % , 2.7 % 97.3\%,\ 2.7\% 97.3% , 2.7% 중심화 안 함 ( 0.709 , 0.706 ) (0.709,\ 0.706) ( 0.709 , 0.706 ) 196.8 , 50.6 196.8,\ 50.6 196.8 , 50.6 93.8 % , 6.2 % 93.8\%,\ 6.2\% 93.8% , 6.2%
중심화하지 않은 제1주성분과 평균 방향의 각이 0.00 9 ∘ 0.009^\circ 0.00 9 ∘ 다. 평균 방향 그 자체다.
그리고 진짜 제1주성분과의 각은 89.8 7 ∘ 89.87^\circ 89.8 7 ∘ 로, 있을 수 있는 최악의 오답이다.
더 고약한 것은 아무 경고도 나지 않는다 는 점이다. 설명분산 93.8%는 오히려 그럴듯해
보인다. 첫 특이값 196.8을 제곱하면 38747인데, m ∥ μ ∥ 2 = 300 × 128.9 = 38674 m\lVert\boldsymbol{\mu}\rVert^2 = 300 \times 128.9
= 38674 m ∥ μ ∥ 2 = 300 × 128.9 = 38674 다. 거의 전부가 평균에서 온 것이다.
Figure 5: 왼쪽에서 빨간 직선(중심화하지 않은 제1주성분)이 구름을 가로지르지 않고 원점에서
평균으로 뻗는다. 오른쪽 그림은 평균이 커질수록 각도 오차가 어떻게 변하는지 잰 것으로,
∥ μ ∥ \lVert\boldsymbol{\mu}\rVert ∥ μ ∥ 가 퍼짐 3을 넘는 지점에서 곧장 90도로 튄다.
7. 무엇을 최소로 하는가 ¶ PCA는 회귀가 아니다 ¶ 앵커에 세 개의 직선을 그어 보자. S x x = 20 S_{xx} = 20 S xx = 20 , S y y = 8 S_{yy} = 8 S yy = 8 , S x y = 8 S_{xy} = 8 S x y = 8 이다.
(y on x) S x y S x x = 8 20 = 0.4 , (PC1) 1 2 , (x on y) S y y S x y = 8 8 = 1 \text{(y on x)}\ \frac{S_{xy}}{S_{xx}} = \frac{8}{20} = 0.4,
\qquad
\text{(PC1)}\ \frac{1}{2},
\qquad
\text{(x on y)}\ \frac{S_{yy}}{S_{xy}} = \frac{8}{8} = 1 (y on x) S xx S x y = 20 8 = 0.4 , (PC1) 2 1 , (x on y) S x y S yy = 8 8 = 1 (37) 의 세 기울기가 전부 다르다. 왼쪽은 L16의 최소제곱으로 y y y 를
x x x 로 설명한 것이고, 오른쪽은 역할을 바꿔 x x x 를 y y y 로 설명한 뒤 그림에서 읽은 기울기다.
가운데가 제1주성분이고 언제나 두 회귀선 사이에 있다.
무엇을 최소로 하느냐가 다르기 때문이다. 직선 방향을 v \vv{v} v , 그 법선을 n \vv{n} n 이라 하면
∑ i (수직거리) 2 = ∥ X c n ∥ 2 = σ 2 2 , ∑ i (세로거리) 2 = ∥ X c ( 1 , − k ) T ∥ 2 \sum_{i}\text{(수직거리)}^2 = \lVert X_c\vv{n}\rVert^2 = \sigma_2^2,
\qquad
\sum_{i}\text{(세로거리)}^2 = \lVert X_c(1,\,-k)^{\mathsf T}\rVert^2 i ∑ ( 수직거리 ) 2 = ∥ X c n ∥ 2 = σ 2 2 , i ∑ ( 세로거리 ) 2 = ∥ X c ( 1 , − k ) T ∥ 2 가 된다. (38) 의 왼쪽에서 수직거리 제곱합을 최소로 하는 것은
∥ X c n ∥ \lVert X_c\vv{n}\rVert ∥ X c n ∥ 을 최소로 하는 것이고, 그것은 n = q 2 \vv{n} = \vv{q}_2 n = q 2 일 때 λ 2 \lambda_2 λ 2 를
m − 1 m-1 m − 1 배 한 값, 곧 σ 2 2 = 4 \sigma_2^2 = 4 σ 2 2 = 4 다. PCA가 최소로 하는 것은 수직거리다.
반면 최소제곱은 세로거리를 최소로 하고 그 값은 4.8이다.
PC1 : ∑ d ⊥ 2 = 4.00 , (y on x) : ∑ d ⊥ 2 = 4.14 \text{PC1}:\ \sum d_\perp^2 = 4.00,
\qquad
\text{(y on x)}:\ \sum d_\perp^2 = 4.14 PC1 : ∑ d ⊥ 2 = 4.00 , (y on x) : ∑ d ⊥ 2 = 4.14 (39) 의 두 값을 견주면 수직거리로 재었을 때 PC1이 이긴다.
세로거리로 재면 4.80 대 5.00으로 반대가 된다. 둘 다 옳고, 다른 문제를 푼 것이다.
Figure 6: 같은 다섯 점에 그은 세 직선과, 각각이 짧게 만들려 애쓰는 거리다. 가운데는 수직으로
떨어뜨린 선분이고 오른쪽은 세로로 떨어뜨린 선분이다.
눈금을 바꾸면 답이 바뀐다 ¶ 변수 j j j 의 단위를 바꾸는 것은 열에 상수를 곱하는 일이다.
X c ⟶ X c D ⟹ C ⟶ D C D , D = diag ( d 1 , … , d n ) X_c \longrightarrow X_c D
\qquad\Longrightarrow\qquad
C \longrightarrow DCD,
\qquad D = \diag(d_1, \dots, d_n) X c ⟶ X c D ⟹ C ⟶ D C D , D = diag ( d 1 , … , d n ) (40) 의 변환은 C C C 를 닮음이 아니라 합동 으로 바꾼다(L32). 닮음이라면
고윳값이 보존될 텐데 합동은 부호만 보존한다. 그러니 주성분이 바뀌는 것이 당연하다.
앵커에서 둘째 변수를 10배 해 보자.
D = diag ( 1 , 10 ) ⟹ D C D = [ 5 20 20 200 ] , λ = 202.03 , 2.97 D = \diag(1, 10)
\ \Longrightarrow\
DCD = \begin{bmatrix} 5 & 20 \\ 20 & 200 \end{bmatrix},
\qquad
\lambda = 202.03,\ 2.97 D = diag ( 1 , 10 ) ⟹ D C D = [ 5 20 20 200 ] , λ = 202.03 , 2.97 (41) 의 새 주성분은 ( 0.101 , 0.995 ) (0.101,\ 0.995) ( 0.101 , 0.995 ) 로 거의 y y y 축이고, 설명분산은
98.6%로 치솟는다. 원래 26.5 7 ∘ 26.57^\circ 26.5 7 ∘ 였던 것이 84.2 0 ∘ 84.20^\circ 84.2 0 ∘ 가 되었다.
자료는 하나도 달라지지 않았는데 답이 달라졌다.
그래서 단위가 제각각인 변수를 다룰 때는 각 열을 표준편차로 나눈 뒤 PCA를 건다.
그러면 C C C 대신 상관행렬이 들어간다.
R = [ 1 ρ ρ 1 ] , ρ = S x y S x x S y y = 8 160 ≈ 0.6325 , λ = 1 ± ρ R = \begin{bmatrix} 1 & \rho \\ \rho & 1 \end{bmatrix},
\qquad
\rho = \frac{S_{xy}}{\sqrt{S_{xx}S_{yy}}} = \frac{8}{\sqrt{160}} \approx 0.6325,
\qquad
\lambda = 1 \pm \rho R = [ 1 ρ ρ 1 ] , ρ = S xx S yy S x y = 160 8 ≈ 0.6325 , λ = 1 ± ρ (42) 의 고윳값이 1 + ρ 1+\rho 1 + ρ 와 1 − ρ 1-\rho 1 − ρ 인 것은 R R R 의 대각합이 2이고 행렬식이
1 − ρ 2 1-\rho^2 1 − ρ 2 이기 때문이다. 그리고 2 × 2 2 \times 2 2 × 2 상관행렬의 제1주성분은 ρ \rho ρ 가 무엇이든
언제나 ( 1 , 1 ) / 2 (1,1)/\sqrt2 ( 1 , 1 ) / 2 다. 표준화가 선택이 아니라 판단 임을 보여 주는 예다.
8. 자주 하는 오해 ¶ ① 공분산행렬을 만들어 고유분해하는 것이 정석이다.
아니다. 종이 위에서는 그것이 정의지만 계산에서는 조건수를 제곱해 버린다. 5절이 답이다.
κ ( X c ) \kappa(X_c) κ ( X c ) 가 108 을 넘으면 작은 고윳값이 음수로 나오기까지 한다.
데이터 행렬에 SVD를 거는 것이 정석이다.
② 주성분은 원래 변수 중에서 고른 것이다.
아니다. 주성분은 모든 변수의 선형결합 이다. q 1 \vv{q}_1 q 1 의 성분이 각 변수의 기여도이고,
성분 대부분이 0이 아니므로 "몇 번 변수를 골랐다"고 말할 수 없다. 변수를 실제로 골라야
한다면 그것은 다른 문제이고 다른 도구가 필요하다.
③ 설명분산이 높으면 좋은 주성분이다.
아니다. 6절의 실험이 반례다. 중심화를 빼먹으면 설명분산이 오히려 올라간다.
평균이라는 아무 정보도 없는 방향이 분산을 독차지하기 때문이다.
설명분산은 "잘 맞았다"가 아니라 "이 방향이 길다"는 뜻일 뿐이다.
④ 주성분의 부호에 뜻이 있다.
아니다. q \vv{q} q 가 고유벡터면 − q -\vv{q} − q 도 고유벡터이고, 두 답 사이에 우열이 없다.
같은 자료를 다른 라이브러리에 넣으면 부호가 뒤집혀 나오는 일이 흔하다.
부호가 아니라 축과 점수의 상대적 배치를 읽어야 한다.
⑤ PCA로 줄인 좌표가 회귀에 가장 좋은 변수다.
아니다. PCA는 목표변수를 본 적이 없다. 분산이 큰 방향과 목표를 잘 설명하는 방향은
아무 관계가 없고, 목표에 중요한 정보가 마침 분산이 작은 방향에 들어 있으면 그것을
버리게 된다. 목표를 함께 보고 싶다면 부분최소제곱 같은 다른 방법이 있다.
⑥ 주성분이 직교하니 원래 변수들도 독립이 된다.
아니다. 새 좌표의 상관이 0 인 것은 맞다. (23) 에서 Y T Y Y^{\mathsf T}Y Y T Y 가
대각행렬이기 때문이다. 그러나 상관이 0인 것과 통계적으로 독립인 것은 다르다.
공분산은 이차 정보만 보므로, 비선형으로 묶여 있는 관계는 PCA가 보지 못한다.
마치며... ¶ 이번 강의에서는 주성분분석이 무엇을 하는 계산인지 처음부터 끝까지 따라가 보았다.
분산이 최대인 방향을 찾는 문제는 레일리 몫의 최대화 이고, 답은 최대 고윳값의
고유벡터다. 증명은 정규직교 기저로 갈아 끼우는 것이 전부였다(L25).
C = X c T X c / ( m − 1 ) C = X_c^{\mathsf T}X_c/(m-1) C = X c T X c / ( m − 1 ) 은 대칭이고 양의 준정부호이므로 고윳값이 실수이고
음수가 아니다(L27). 두 번째 주성분이 첫 번째와 직교하는 것은 공짜로 따라온다.
X c = U Σ V T X_c = U\Sigma V^{\mathsf T} X c = U Σ V T 를 걸면 V V V 가 주성분이고 λ i = σ i 2 / ( m − 1 ) \lambda_i = \sigma_i^2/(m-1) λ i = σ i 2 / ( m − 1 ) 이다.
점수는 U Σ U\Sigma U Σ 라서 곱셈조차 필요 없다(L29).
설명분산 비율 σ i 2 / ∑ σ j 2 \sigma_i^2/\sum\sigma_j^2 σ i 2 / ∑ σ j 2 은 L29의 에너지와 같은 수 이고,
주성분 k k k 개를 남기는 것은 에크하르트-영의 랭크 k k k 근사 그 자체다.
공분산행렬을 만들면 조건수가 제곱된다. 그래서 라이브러리는 그것을 만들지 않는다.
중심화를 빼먹으면 제1주성분이 평균 방향이 된다. 그러고도 설명분산은 더 좋아 보인다.
돌아보면 이 강의에는 새 정리가 하나도 없었다. 스펙트럼 정리는 L25에 있었고, 준정부호는
L27에 있었고, SVD와 에너지는 L29에 있었고, 조건수의 제곱은 L33에 있었고, 투영은 L15에
있었고, 합동과 닮음의 구별은 L32에 있었다. 여러분이 한 줄로 호출하던 함수 안에서
벌어지는 일이, 지난 서른네 강의의 내용 그대로였다.
다음은 보강 2, 수치선형대수 입문 이다. 이번 강의에서 "옳은 공식과 쓰는 공식은
다르다"는 교훈이 다섯 번째로 나왔다. 다섯 번이면 우연이 아니다. 그 다섯을 조건수라는
하나의 개념으로 묶고, 큰 행렬의 고윳값을 실제로 어떻게 구하는지 살펴보자.
그리고 L22에서 벡터에 행렬을 자꾸 곱하던 그 애니메이션이 사실은 알고리즘이었다는 것도
그때 밝힌다.
이번 강의의 내용을 파이썬으로 확인해 보려면 L35 실습 노트북 으로
넘어가면 된다. 주성분 함수를 스무 줄로 직접 만들어 앵커의 손계산과 대조하고, 자를
돌려 가며 분산이 6과 1 사이를 오가는 것을 보고, 조건수를 키워 가며 공분산 경유와 SVD
직접이 어디서 갈라지는지 직접 잴 수 있다.