코사인 유사도

코사인 유사도(― 類似度, 영어: cosine similarity)는 내적공간의 두 벡터간 각도의 코사인값을 이용하여 측정된 벡터간의 유사한 정도를 의미한다. 각도가 0°일 때의 코사인값은 1이며, 다른 모든 각도의 코사인값은 1보다 작다. 따라서 이 값은 벡터의 크기가 아닌 방향의 유사도를 판단하는 목적으로 사용되며, 두 벡터의 방향이 완전히 같을 경우 1, 90°의 각을 이룰 경우 0, 180°로 완전히 반대 방향인 경우 -1의 값을 갖는다. 이 때 벡터의 크기는 값에 아무런 영향을 미치지 않는다. 코사인 유사도는 특히 결과값이 [0,1]의 범위로 떨어지는 수 공간에서 사용된다. 코사인 유사도는 어떤 개수의 차원에도 적용이 가능하여 흔히 다차원의 양수 공간에서의 유사도 측정에 자주 이용된다. 예를 들어 정보 검색 및 텍스트 마이닝 분야에서, 단어 하나 하나는 각각의 차원을 구성하고 문서는 각 단어가 문서에 나타나는 회수로 표현되는 벡터값을 가진다. 이러한 다차원 공간에서 코사인 유사도는 두 문서의 유사를 측정하는 매우 유용한 방법이다. 코사인 유사도는 데이터 마이닝 분야에서 클러스터들간의 응집도를 측정하는 방법으로도 사용된다. 코사인 거리(cosine distance)라는 개념이 대신 사용되기도 하는데, 이는 D C ( A , B ) = 1 − S C ( A , B ) {\displaystyle D_{C}(A,B)=1-S_{C}(A,B)} 으로 표현된다. 단, 코사인 거리는 삼각부등식의 성질을 갖고 있지 않으며 코사인 공리도 만족하지 않기 때문에 정확한 거리 함수로 사용할 수는 없다. 순서를 유지하면서 삼각부등식 성질을 만족시키기 위해서는 각거리를 이용해야 한다.(정의 항목 참조) 코사인 유사도가 널리 사용되는 이유 중 하나는 이것이 양수 공간이라는 조건만 만족하면 얼마나 많은 차원 공간에서든지 거리를 측정하는 것이 가능하기 때문이다. 두 벡터의 코사인값은 유클리디안 스칼라곱 공식에서 유도할 수 있다. a ⋅ b = ‖ a ‖ ‖ b ‖ cos ⁡ θ {\displaystyle \mathbf {a} \cdot \mathbf {b} =\left\|\mathbf {a} \right\|\left\|\mathbf {b} \right\|\cos \theta } 속성 A, B의 벡터값이 각각 주어졌을 때, 코사인 유사도 cos(θ)는 벡터의 스칼라곱과 크기로 다음과 같이 표현할 수 있다. similarity = cos ⁡ ( θ ) = A ⋅ B ‖ A ‖ ‖ B ‖ = ∑ i = 1 n A i × B i ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 {\displaystyle {\text{similarity}}=\cos(\theta )={A\cdot B \over \|A\|\|B\|}={\frac {\sum \limits _{i=1}^{n}{A_{i}\times B_{i}}}{{\sqrt {\sum \limits _{i=1}^{n}{(A_{i})^{2}}}}\times {\sqrt {\sum \limits _{i=1}^{n}{(B_{i})^{2}}}}}}} 이렇게 계산된 유사도는 −1에서 1까지의 값을 가지며, −1은 서로 완전히 반대되는 경우, 0은 서로 독립적인 경우, 1은 서로 완전히 같은 경우를 의미한다. 텍스트 매칭에 적용될 경우, A, B의 벡터로는 일반적으로 해당 문서에서의 단어 빈도가 사용된다. 코사인 유사도는 문서들간의 유사도를 비교할 때 문서의 길이를 정규화하는 방법의 하나라고 볼 수도 있다. 정보 검색의 경우, 문서의 단어 빈도(tf-idf 가중치)가 음의 값이 되는 것이 불가능하므로 두 문서 사이의 코사인 유사도는 0에서 1까지의 값으로 표현되며, 두 단어 빈도간의 각도는 90°를 넘을 수 없다. 코사인 유사도의 주된 용례는 위에서 정의한 내용과 같지만, 때로는 서로 다른 계수를 표현하기 위한 용도로 사용되기도 한다. 동일한 유사도 계산 방법을 이용해서, 두 벡터간의 정규화된 각도가 [0,1] 범위의 유사도 함수로서 사용되어 벡터 계수가 양 또는 음의 값을 갖는 영역에서는 다음과 같이 계산된다. 1 − ( cos − 1 ⁡ ( similarity ) π ) {\displaystyle 1-\left({\frac {\cos ^{-1}({\text{similarity}})}{\pi }}\right)} 또, 벡터 계수가 항상 양의 값을 갖는 영역에서는 다음과 같이 계산된다. 1 − ( 2 ⋅ cos − 1 ⁡ ( similarity ) π ) {\displaystyle 1-\left({\frac {2\cdot \cos ^{-1}({\text{similarity}})}{\pi }}\right)} ‘코사인 유사도’라는 용어는 이러한 각거리를 위해 사용되지만, 간혹 각도 자체의 계산 편의를 위한 목적에서 각도의 코사인값으로 잘못 사용되는 경우가 있는데, 이는 부정확한 단어 사용에 해당한다. 1에서 이 계수를 뺀 값을 거리의 함수처럼 사용하는 것은 완전히 잘못된 적용인데, 이는 각도가 0이지만 L2 놈(norm)은 다른 두 벡터를 생각해보면 쉽게 알 수 있다. 정확한 거리 함수를 적용해도 서로 다른 이 두 벡터가 같은 것처럼 판단하게 될 것이다. 그러나 대부분의 경우 이것은 중요한 속성은 아니다. 벡터 집합 내에서의 상대적인 유사도나 거리만이 중요한 측정 대상인 상황에서는 어떤 함수를 적용하더라도 결과의 순서는 동일하기 때문이다. 코사인 유사도는 다음과 같이 유클리드 거리와 관계가 있다. 유클리드 거리를 |A - B|로 나타냈을 때, 다항식을 전개하여 다음과 같은 식이 성립한다. | A − B | 2 = ( A − B ) ⊤ ( A − B ) = | A | 2 + | B | 2 − 2 A ⊤ B {\displaystyle |A-B|^{2}=(A-B)^{\top }(A-B)=|A|^{2}+|B|^{2}-2A^{\top }B} A와 B가 단위 거리에 대해 정규화되었을 때, |A| = |B| = 1이며 따라서 위의 식은 다음의 식과 동일하다. 2 ( 1 − cos ⁡ ( A , B ) ) {\displaystyle 2(1-\cos(A,B))} 해밍 거리 상관성 유사도 학습 (영어) Singhal, Amit (2001). "Modern Information Retrieval: A Brief Overview". Bulletin of the IEEE Computer Society Technical Committee on Data Engineering 24 (4): 35–43. (영어) P.-N. Tan, M. Steinbach & V. Kumar, "Introduction to Data Mining", , Addison-Wesley (2005), ISBN 0-321-32136-7, chapter 8; page 500. (영어) 온라인 코사인 유사도 계산기 (영어) 코사인 측정 (영어) 파이썬을 이용한 코사인 유사도 튜토리얼