google_adsense2


데이터 분석에서 나오는 수학 - 코사인 유사도 by 메타샤워


코사인 유사도


벡터공간 ( Vector Space ) 는 우리가 가지고 있는 데이터를 좌표계에 표현하기 위해 나온 개념이다.
음성데이터든, 이미지 데이터든, 문서 데이터든 해당 데이터가 가지고 있는 특성을 x,y축 또는 x,y,z,,,, 축 등
다차원 좌표계에 표시할수 있다면 해당 좌표들 끼리의 유사도를 계산할수가 있게 된다.

예를들어 2개의 특성으로 구분된 데이터라고 가정을 해보자. 
문서데이터를 예로 들어 문서에 들어있는 단어는 오로지 A라는 단어와 B 라는 단어 2가지로 이루어져 있다면
문서들이 A라는 단어와 B라는 단어를 얼마나 많이 또는 적게 가지고 있느냐에 따라서 A축과 B축의 좌표계로 문서들을 표시 할수 있다.
변수가 A, B 두개 밖에 없어 2차원 좌표계에 표시하였지만 
데이터가 가지고 있는 특성에 따라서 3차원 10차원 200차원의 좌표계에 표시해야 할 수 있다.

좌표계에 표시된 데이터들의 벡터내적값을 이용하면 데이터들 끼리의 유사도를 구할수 있다.
유클리디안 거리는 단순히 좌표에 표시된 데이터들 간에 거리를 비교하여 
거리가 멀면 유사도가 적고 가까우면 유사한 데이터라고 판별하지만
코사인 유사도 같은 경우에 문서의 단어들이 적게 있지만 A가 3개 B가 3개 있는 문서와 문서의 단어가 많이 있지만 
A가 300개 B가 300개 있는 데이터는 서로 유사한 데이터라고 볼수 있다. 
이런 문서간의 좌표의 실제 거리는 굉장히 멀겠지만 벡터내적을 구하면 두 데이터는 같은 데이터로 결과가 나오게된다.

이렇게 데이터가 가지고 있는 특성의 비율로서 데이터의 유사도를 측정하는 방법이 코사인 유사도이다.



코사인유사도는 벡터내적 공식을 이용하여 구할수 있다.

먼저 벡터내적 공식이다.


vector6.png

vector4.png

여기서  A벡터의 절대값인 vector5_copy1.png 은 A벡터의 크기를 말한다. 
벡터는 방향과 크기를 가진 물리량인데 방향성을 소거하고 크기만을 표현할때 이렇게 표현한다.
vector5_copy1.png벡터의 크기를 구하는 방법은 
vector8.png

 A벡터가 가지고 있는 요소들의 제곱의 합에 루트를 씌워주면 A벡터의 크기가 된다. 
원점으로 부터 A벡터까지의 거리 공식을 이용하면 되는것이다.


여기서 벡터의 내적공식을 다른 풀이형태로 표현할수 있다. (코사인 제 2법칙으로 증명할수 있지만 안하겠다. )

vector7.png

위 공식으로 A벡터와 B벡터의 내적값을 요소로서 구할수 있다. 
코사인 내적으로 실시하면 방향이 없는 스칼라 물리량이 구해진다. 


벡터의 내적을 표현하는 2가지 공식으로서 두 벡터간의 코사인 값은 아래와 같이 정리 할수 있다.

vector10.png


이제 쉽게 말해 보자 

두 데이터간의 코사인 유사도는 각 데이터들의 값을 모두 제곱하여 더한 값에 루트를 씌운 곱들을 분모로 하여 
서로 간 같은 축에 있는 데이터들끼리 곱한것에 총합을 분자로 하면 
두 데이터간의 코사인 값을 구할수 있다. 


그럼 이제부터 이 두 벡터간의 코사인값이 어떻게 유사도를 나타낼수 있는지 이야기 해보아야 한다.

두 벡터가 얼마나 유사한가는 두 벡터의 좌표를 이용하여 유클리디안 거리 측정으로 구할수 있다.
하지만 이것은 각도에의해 구한것이 아닌 그저 거리로만 계산한 방법이다.
벡터의 성질인 크기와 방향을 이용하여 유사도를 측정하는 방법으로 가장 많이 사용되는 방법은 코사인값을 활용하는 방법이다.

코사인은 -1 부터 1까지의 값을 갖는다.
코사인 각이 0이라면 두 벡터가 가장 가깝게 되고 유사도는 1이 된다. 
코사인 각이 180이라면 두 벡터가 가장 멀리 있게 되고 유사도는 -1이 된다.

이런 이유로 단순히 코사인 각만 가지고도 유사도를 측정할수 있게 되는것이다.


하지만 제일 위에서 언급했듯이 이것은 벡터의 방향성만 가지고 유사도를 측정한것이기 때문에 벡터가 가지고 있는 크기에 대해서는
논하지 않았다. 아래 그림을 보자. 

20080829_000036.png

 위 그림에서 왼쪽의 A벡터와 B벡터는 오른쪽 A벡터와 B벡터간 유사도는 코사인 유사도로는 갖게 나온다.
물론 유클리디안 거리는 다르게 나오겠지만 말이다.

서로 다른 값을 가지지만 사잇각이 같다는 이유로 같은 유사로라고 판단하는것이 문제가 될수도 있다. (물론 안될수도 있다. )

그래서 이를 보완하기 위해서 하나의 벡터를 또 다른 벡터에 투영하여 얻어진 길이로 유사도를 구할수도 있다.

20080829_000408.png

투영한 길이는 두백터의 크기와 방향에 따라서 모두 영향을 받는 길이이기 때문에 
투영한 길이가 길면 더욱 유사한 값이라고 판단할수 있고 
투영한 길이가 짧은 덜 유사한 값이라고 판단할수 있다.

사잇각이 좁으면 좁을수록 투영한 길이는 길것이고 벡터의 크기가 비슷해야 투영한 길이도 비슷하게 나올것이기 때문이다.

그럼 이 투영한 길이를 어떻게 구하는지 알아야 한다.
코사인 쎼타의 값은 투영한 길이 / A벡터의 길이 이기 때문에

투영한 길이는 이렇게 표현할 수 있다. 
20080829_001625.png


이렇게 되면 비교되는 각 벡터간 투영된 길이가 나오는데 백터마다 기준 벡터값이 다 다르기 때문에 마지막으로 
투영된 길이를 비교된는 벡터의 크기로 나누어주어 비교 가능하도록 정규화 하는 작업이 필요하다.

이제 사용예를 들어보자


3개의 문서가 주어져 있다.

A
B
C
D
D1
3
2
0
2
D2
1
2
3
0
D3
2
2
2


D1 문서에는 A라는 단어가 3개, B라는 단어가 2개, C라는 단어가 0개, D라는 단어가 2개
D2 문서에는 A라는 단어가 1개, B라는 단어가 2개, C라는 단어가 3개, D라는 단어가 0개
D3문서에는 A라는 단어가 2개, B라는 단어가 2개, C라는 단어가 2개, D라는 단어가 2개

이상태에서 Q문서가 주어지고 Q문서는 D1, D2, D3 문서중 어떤 문서와 가장 유사도가 높은지 구해보자.

Q문서는 A문자가 1개 나오고 B문자가 5개 나오는 문서이다.

Q = { 1, 5, 0, 0 }

풀이법 1 코사인 유사도를 구한다. )
20080829_003246.png


이로 보어 D1 문서가 Q문서와 가장 유사하다고 볼수 있다.



풀이법 2 투영된 길이의 비율을 구한다. ) 

Q문서의 벡터를 각 문서 D1, D2, D3 벡터에 투영된 길이를 각각 R1, R2, R3 이라고 보고 다음과 같이 계산할수 있다.

20080829_004306.png

이 계산된 각 투영된 길이를 기준 문서로 나누어 투영된 길이의 비율을 구한다.
각각 투영된 비율을 r1, r2, r3 이라고 하고 계산해보자.

20080829_004636.png

이렇게 투영된 길이의 비율로 비교를 하니 D2 문서가 Q문서와 가장 유사하다고 결과가 나왔다.




물론 투영된 길이의 비율로 유사도를 측정하는것이 코사인 값만 가지고 유사도를 측정하는것 보다 더 정확할수는 있겠지만
데이터의 성격상 단위 벡터로만 벡터들이 생성된다거나 벡터의 크기 자체가 별로 중요하지 않다고 판단하기도 하고
대용량 데이터를 처리해야 하는 경우 계산 속도의 향상을 위해 코사인 유사도만 가지고 유사도를 측정 할수도 있다.




















핑백

덧글

댓글 입력 영역


google_adsense