2.새로운 좌표를 찾아보자!

지난 포스팅에서는 선형대수학을 배우는 이유 2개를 알아보았습니다. 이번 포스팅에서는 벡터들이 나타나는 공간인 벡터 스페이스, 즉 좌표계에서 새로운 축들이 PCA에 의해 소개될 때, 이 축들이 우연히 수직(orthogonal)하면 기존 데이터들의 좌표를 projection을 통해 어떻게 바꾸는지 알아보겠습니다. 


목표 : 데이터들을 가장 잘 표현하는 축(axis)을 찾자.

벡터란 데이터의 특징(feature)를 표현하는 '리스트'로 볼 수도 있다고 소개드렸습니다. 데이터는 각 feature를 축으로 하는 좌표평면의 한 점으로 표시할 수 있습니다. 예를 들어 '철수 : 수학 70점, 영어 80점, 과학 90점'이라는 데이터를 그래프에 표현한다면 x축: 수학, y축: 영어, z축: 과학이라는 3차원 좌표공간에 '철수의 점수'를 표시할 수 있습니다. 아래 그림처럼 말이지요.



몇몇 분야에서는 이 데이터를 표현하는 피처가 수백, 수천가지에 이르기도 합니다. 각각의 피처 하나가 한 개의 축이 되기 때문에 이런 수백개의 피처를 가지고 있는 데이터들은 수백차원의 좌표공간에서 데이터를 표시해야 하는 문제점이 생깁니다. 문제가 되는 이유는 공간 차원이 커지면 커질수록, 각 데이터들간의 거리가 멀어지기 때문입니다. 2 x 2 공간(2차원 공간)에서 4개의 점을 찍는 것과 2 x 2 x 2(3차원 공간)에서 4개의 점을 찍을 때, 3차원 공간에 있는 점들간의 거리가 2차원 공간보다 더 먼 것과 같은 이유입니다.


이처럼 각 데이터들간의 거리가 멀게되면 주변에 있는 데이터들을 이용해서 데이터의 성질을 판별하는 알고리즘이 작동하지 않는 문제가 발생합니다. K-Nearest Neighbor같은 알고리즘을 사용할 수 없게 되는 것이지요. 이처럼 차원이 너무 커서 각 데이터간 거리가 멀어 발생하는 문제 현상을 '차원의 저주(curse of dimensionality)라 합니다. 또한 차원이 너무 크면 시각화하기 어렵다는 문제도 있습니다. 당장 4차원만 되어도 이를 시각화할 수 없죠. 


더욱 중요한 점은 이런 모든 피처들이 데이터의 특성을 나타내는데 별 관련이 없는 경우가 많다는 점입니다. 예를 들어 남자, 여자를 나누는 알고리즘을 만들고 싶을 때, 눈의 갯수, 코의 크기 등은 중요하지 않은 피처입니다. 이처럼 데이터가 가지고 있는 피처의 갯수보다 더 적은 feature를 이용하여 기존의 데이터를 표현하는 방법을 dimension reduction(차원 축소)라고 합니다. 하나의 피처가 하나의 축, 즉 공간이라는 점을 생각한다면 피처의 갯수를 줄인다는 것은 좌표공간의 차원을 축소하는 것과 동일하기 때문입니다.


데이터의 차원을 줄이려면? PCA!

대표적인 차원 축소의 방법에는 Principal Component Analysis(PCA)가 있습니다. 이 PCA를 하는 방법은 총 3단계로 이루어집니다.


1단계 : 데이터들의 분포에서 가장 변동성이 큰 방향으로 선을 긋습니다.

2단계 : (i)1단계에서 그었던 선과 수직인 선들 중에서, (ii)데이터의 분포가 가장 큰 방향의 선을 긋습니다.

3단계 : 2단계를 반복하면 되는데, 자신이 정한 기준이 미충족 될 때까지 반복합니다. 


변동성이 가장 큰 방향으로 수직선을 긋는 이유는 변동성이 큰 방향이 많은 정보를 담고 있기 때문입니다. 변동성이 큰 방향으로 피처들을 조합하여 새로운 피처를 만들어 데이터의 분포를 설명할 때, 가장 세밀하게 데이터 분포를 설명할 수 있습니다. 예를 들어 주어진 여러 개의 색들에 대하여, 5개의 단어(변동성이 적은 피처 조합)로 색을 구별해야 하는 경우와 100개의 단어(변동성이 큰 피처 조합)로 색을 구별해야 하는 경우, 100개의 단어를 쓸 때 더욱 세밀하게 색을 구별할 수 있는 것과 같은 이치입니다. 



위의 Figure 6.14의 그림은 '인구 규모'와 '광고 비용'을 좌표평면에 나타낸 것입니다. 좌표평면은 차원이 2개밖에 없기 때문에, PCA로 선을 2개밖에 긋지 못하여 1단계, 2단계만 실행할 수 있습니다. 이렇게 찾은 초록새 선은 데이터들(보라색 점들)의 분포를 가장 잘 설명할 수 있는 선입니다. 데이터 차원이 좀 더 컸더라면 파랑색 점선도 의미가 있었겠지만 이 Figure 6.14에서는 단순한 노이즈로밖에 보이질 않네요. 이렇게 PCA로 찾은 초록색 실선과 파랑색 실선을 principal component라고 부르며 이들을 축으로 하는 좌표평면을 만들 수 있습니다.

 


위의 그래프는 원래 좌표평면인 Figure 6.14도 2차원이었기 때문에 시각적인면에서 PCA를 이용함으로써 얻는 이익이 거의 없습니다. 단 수백차원의 데이터를 2차원의 데이터로 줄일 수 있다면 큰 도움이 되겠지요. 기존의 축(Population, Ad Spending) -> 새로운 축(1st principal component, 2nd principal component)으로 바꾸는 것을 basis를 바꾼다고 합니다. 사실 basis의 뜻은 '축에서의 기본 단위'이지만, 축이 바뀌면 당연히 basis도 바뀌니 축이 바뀔 때 basis 가 바뀐다고 생각하셔도 됩니다. basis가 바뀔 때, Figure 6.14에 있던 데이터들의 위치가 바로 위 그래프에서도 바뀐 게 보이시나요? 그렇다면 basis가 바뀔 때 데이터들의 좌표는 어떻게 바꿀 수 있을까요? 


How to change points using projection


위 그림의 좌표평면은 [1,0], [0,1] 을 각각 basis vector로 가지는 좌표평면입니다. 이 때 r이라는 벡터가 있는데, r은 e1 hat 기저백터로 3번만큼 이동하고, e2 hat 기저벡터로 4번만큼 이동하였습니다. 그렇다면 현재 e1 hat = [1,0]. e2 hat = [0,1]이라는 사실을 알고 있기 때문에 r의 좌표를 계산할 수 있습니다. 참고로, 좌표평면 위에서의 벡터의 좌표는 전적으로 기저벡터에 의해 정해집니다. r의 좌표로 [3,4]라고 말하고 있지만, 머릿속에서 선행되어야 하는 생각은 3*(e1 hat) + 4*(e2 hat)입니다. 이렇게 기저벡터를 먼저 떠올리는게 중요한 이유는 앞으로 데이터를 분석하면서 차원을 축소하거나, 데이터에서 가장 정보가 많은 축으로 데이터를 표현하기 위해 기저 벡터를 바꾸어야 할 일이 생기기 때문입니다. 


만약 이 상황에서 basis vector 가 b1 hat = [2,1], b2 hat = [-2,4]로 바뀐다면, r벡터를 이 새로바뀐 basis vector로 어떻게 표현할 수 있을까요? 우선 가장 먼저 확인해야 할 사항은 새로운 두 basis vector가 수직인지 확인해야 합니다. 왜냐하면 두 벡터가 수직이라면 projection을 이용하여 쉽게 r 벡터를 basis vector로 표현할 수 있기 때문입니다. 아직 projection 설명을 안드렸기 때문에 'projection이 뭐야?'라고 생각하실 것 같은데요. 그러면 projection에 대해 알아보겠습니다.


projection이란?

제가 정의한 projection은 '한 벡터에 다른 벡터가 얼마나 들어있는지 알아보기 위해 벡터를 분해하는 장치'입니다. 두 벡터끼리 합성을 할 수 있는 것처럼, 분해도 할 수 있는데요. 한 벡터가 다른 벡터의 방향으로 얼마만큼의 크기를 갖고 있는지 알고 싶으면 사용하는게 projection입니다. 아래 그림을 보시면 더 잘 이해할 수 있니다.



scalar projection

s와 r 두개의 벡터가 있을 때, s 벡터가 r 벡터 방향으로 얼마만큼의 크기를 가지는지 알고 싶을 때 사용하는 개념입니다. s 벡터에서 r벡터로 수선의 발을 내려주어 원점에서 수선의 발 까지의 거리를 r'라고 정의하면, 이 r'는 s를 빗변으로 하는 삼각형의 밑변(adjacent)의 길이가 됩니다. 그러면 cosine의 정의에 따라 계산해보면, r'의 길이는 위 필기에 쓰인 것처럼 |s| * cos θ 값과 같습니다. 


내적과 scalar projection

이전 포스팅에서 언급한 cosine rule에 따르면 r.s = |r| * |s| * cos θ입니다. r벡터와 s벡터를 내적한 결과는 두 벡터의 크기와 그 사이각의 코사인 값과 같다는 뜻인데요, 위의 scalar projection의 결과를 이용하면 |r| * |s| *  cos θ = |r| * |r'| 입니다. 즉, 내적은 '두 벡터의 곱'이라고 해석할 수도 있는 것이지요. 벡터의 곱을 하기 위해서 서로 다른 방향의 두 벡터 s벡터, r벡터 중 하나를 다른 벡터의 방향으로 바꾸어 준 다음( = |s| * cos θ) 두 벡터를 곱하는 것입니다.


vector projection

scalar projection은 같은 방향의 두 벡터 크기를 곱한 스칼라(scala) 값을 가집니다. 방향성은 없는, 벡터의 크기만을 값으로 가지는 것이죠. 그렇다면 벡터의 방향까지 포함한 r'을 알고 싶으면 어떻게 하면 될까요? 그 때는 r/|r|, 즉, r을 |r|로 나누어주어 r의 방향성만 남아있는 값을 scalar projection에다 곱해주면 됩니다. 위 사진의 필기에서 보듯이 r.r = |r| * |r| * cos 0 = |r|*|r| 이기 때문에 vector projection은 (r.s / r.r) * r 로 쓸 수 잇으며, (r.s / r.r) 는 scalar 를 scalar 로 나눈 것이기 때문에 결과값도 scalar가 됩니다. 따라서 이 값을 k로 치환하면 벡터 s의 vector projection은 k * r과 같이 (scalar 값) * vector로 표현할 수도 있습니다.     


그래서 점의 좌표는 어떻게 바꾸지?

자, 먼길을 돌아왔습니다. projection을 위에서 언급한 이유를 다시 한 번 상기해볼까요? 좌표평면에서 축을 바꾸었을 때, 이 새로 바뀐 축들이 이루는 각도가 90도라면 vector projection을 이용하여 쉽게 기존의 데이터들을 새로 바뀐 축의 좌표평면에 표시할 수 있기 때문입니다. 여기서 '왜 새로 바뀐 축들이 90도를 이루어야만 vector projection을 이용해 데이터를 바꿀 수 있는거야?'라고 물어보실 수 있습니다. 그 이유는 아래 그림을 보신 다음에 설명드리겠습니다.

  


축의 단위인 basis vector가 서로 직각일 때는 백터 r을 각각의 basis vector에 대해 vector projection한 결과를 더하면 r 벡터가 됩니다. 1번째 그림이 그런 경우입니다. 하지만 basis vector가 서로 직각이 아닌 2번째 그림의 경우에서 보실 수 있는 것처럼 vector projection을 각각의 basis vector에 대해 해서 더한 결과가 벡터 l이 되지 않습니다. 이처럼 basis vector가 서로 직각이 아닐 때는 행렬을 이용해서 변환을 해야 하는데 이는 지금 주안점이 아니니 나중에 알아보겠습니다.


그러면 두 basis vector가 서로 직각을 이루는지는 어떻게 알아보면 될까요? 앞에서 배웠던 cosine similarity를 사용하면 됩니다. 우리가 풀고 싶었던 문제를 다시 한 번 가져와 보겠습니다.



b1=[2,1], b2= [-2,4] 라는 두 개의 basis vector가 이루는 각도를 θ라 하면, cos θ= b1.b2 / |b1|*|b2| 인데, b1.b2= 0 이므로 cosθ= 0 이 됩니다. θ=90도 일때 cosθ=0 이므로 두 basis vector가 서로 수직이라는 점을 이용할 수 있게 되었습니다! 따라서 각 basis vector에 대해 r 벡터를 vector projection 해보겠습니다. 


우선 b1 벡터와 r 벡터를 해보면, (r. b1)/ (|b1| * |b1|) = (3*2 + 4*1) / (2*2 + 1*1) = (6+4)/(4+1) = 10/5 = 2, 따라서 r을 b1에 vector projection한 값은 2b1. b2 벡터와 r벡터의 vector projection 결과는 (r.b2)/(|b2| * |b2|) = ( 3*-2 + 4*4) / (-2*-2 + 4*4) = (-6+16) / (4+16) = 10/20 = 0.5. r을 b2에 vector projection한 값은 0.5 b2가 됩니다. 



따라서 이 두 vector projection의 결과를 더하면 b1, b2를 basis vector로 했을 때 벡터 r의 좌표를 표시할 수 있습니다. r= 2b1 + 0.5b2. = (2,0.5) 이 (2, 0.5)를 다시 e1, e2의 좌표로 계산해 보시면 2*(2,1) + 0.5(-2, 4) = (3,4) 로 기존의 e1, e2 basis vector를 사용할 때와 동일하다는 걸 확인할 수 있습니다.


여기서 (3,4) -> (2,0.5) 로 r 벡터의 좌표가 바뀌는게 익숙치 않으실 수도 있습니다. 그 이유는 우리가 평소 사용하는 좌표평면의 basis vector인 (1,0), (0,1)에 너무 익숙하기 때문입니다. (1,0)을 x축의 basis vector로 쓰기 때문에 x축으로 k번 이동했다고 하면 k* (1,0) = (k,0) 이 되어버려 마치 basis vector가 없는 것처럼 느껴지기 때문이죠.


이번 포스팅까지는 vector에 대해 알아보았는데요, 다음 시간부터는 vector의 집합인 '행렬(matrices)'에 대해 알아보겠습니다!  

728x90
더보기

댓글,

하얀눈곰

프랑스에 살고 있습니다. 낯선 나라에 와서 살다보니 생각들이 많습니다. 이 지나가는 생각들을 붙잡아 두기 위해 블로그를 시작했습니다.