{{위키데이터 속성 추적}}
'''코사인 유사도'''(― 類似度, {{llang|en|cosine similarity}})는 [[내적공간]]의 두 [[벡터]]간 각도의 [[코사인]]값을 이용하여 측정된 벡터간의 유사한 정도를 의미한다. 각도가 0°일 때의 코사인값은 1이며, 다른 모든 각도의 코사인값은 1보다 작다. 따라서 이 값은 벡터의 크기가 아닌 방향의 유사도를 판단하는 목적으로 사용되며, 두 벡터의 방향이 완전히 같을 경우 1, 90°의 각을 이룰 경우 0, 180°로 완전히 반대 방향인 경우 -1의 값을 갖는다. 이 때 벡터의 크기는 값에 아무런 영향을 미치지 않는다. 코사인 유사도는 특히 결과값이 [0,1]의 범위로 떨어지는 수 공간에서 사용된다.

코사인 유사도는 어떤 개수의 차원에도 적용이 가능하여 흔히 다차원의 양수 공간에서의 유사도 측정에 자주 이용된다. 예를 들어 [[정보 검색]] 및 [[텍스트 마이닝]] 분야에서, 단어 하나 하나는 각각의 차원을 구성하고 문서는 각 단어가 문서에 나타나는 회수로 표현되는 벡터값을 가진다. 이러한 다차원 공간에서 코사인 유사도는 두 문서의 유사를 측정하는 매우 유용한 방법이다.<ref>{{언어링크|en}} Singhal, Amit (2001). "Modern Information Retrieval: A Brief Overview". Bulletin of the IEEE Computer Society Technical Committee on Data Engineering 24 (4): 35–43.</ref>

코사인 유사도는 [[데이터 마이닝]] 분야에서 [[클러스터]]들간의 응집도를 측정하는 방법으로도 사용된다.<ref>{{언어링크|en}} P.-N. Tan, M. Steinbach & V. Kumar, "Introduction to Data Mining", , Addison-Wesley (2005), {{ISBN|0-321-32136-7}}, chapter 8; page 500.</ref>

''코사인 거리''(cosine distance)라는 개념이 대신 사용되기도 하는데, 이는 <math>D_C(A,B) = 1 - S_C(A,B)</math>으로 표현된다. 단, 코사인 거리는 삼각부등식의 성질을 갖고 있지 않으며 코사인 공리도 만족하지 않기 때문에 정확한 거리 함수로 사용할 수는 없다. 순서를 유지하면서 삼각부등식 성질을 만족시키기 위해서는 [[각거리]]를 이용해야 한다.(정의 항목 참조)

코사인 유사도가 널리 사용되는 이유 중 하나는 이것이 양수 공간이라는 조건만 만족하면 얼마나 많은 차원 공간에서든지 거리를 측정하는 것이 가능하기 때문이다.

==정의==
두 벡터의 코사인값은 유클리디안 [[스칼라곱]] 공식에서 유도할 수 있다.

:<math>\mathbf{a}\cdot\mathbf{b}
=\left\|\mathbf{a}\right\|\left\|\mathbf{b}\right\|\cos\theta</math>

속성 ''A'', ''B''의 벡터값이 각각 주어졌을 때, 코사인 유사도 ''cos(θ)''는 벡터의 스칼라곱과 크기로 다음과 같이 표현할 수 있다.

:<math>\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}} }</math>

이렇게 계산된 유사도는 &minus;1에서 1까지의 값을 가지며, &minus;1은 서로 완전히 반대되는 경우, 0은 서로 독립적인 경우, 1은 서로 완전히 같은 경우를 의미한다.

텍스트 매칭에 적용될 경우, ''A'', ''B''의 벡터로는 일반적으로 해당 문서에서의 [[tf-idf|단어 빈도]]가 사용된다. 코사인 유사도는 문서들간의 유사도를 비교할 때 문서의 길이를 [[정규화]]하는 방법의 하나라고 볼 수도 있다.

[[정보 검색]]의 경우, 문서의 단어 빈도([[tf-idf]] 가중치)가 음의 값이 되는 것이 불가능하므로 두 문서 사이의 코사인 유사도는 0에서 1까지의 값으로 표현되며, 두 단어 빈도간의 각도는 90°를 넘을 수 없다.

=== 각 유사도 ===
코사인 유사도의 주된 용례는 위에서 정의한 내용과 같지만, 때로는 서로 다른 계수를 표현하기 위한 용도로 사용되기도 한다. 동일한 유사도 계산 방법을 이용해서, 두 벡터간의 정규화된 각도가 [0,1] 범위의 유사도 함수로서 사용되어 벡터 계수가 양 또는 음의 값을 갖는 영역에서는 다음과 같이 계산된다.
:<math>1 - \left ( \frac{ \cos^{-1}( \text{similarity} )}{ \pi} \right )</math>
또, 벡터 계수가 항상 양의 값을 갖는 영역에서는 다음과 같이 계산된다.
:<math>1 - \left ( \frac{ 2 \cdot \cos^{-1}( \text{similarity} ) }{ \pi } \right)</math>

‘코사인 유사도’라는 용어는 이러한 [[각거리]]를 위해 사용되지만, 간혹 각도 자체의 계산 편의를 위한 목적에서 각도의 코사인값으로 잘못 사용되는 경우가 있는데, 이는 부정확한 단어 사용에 해당한다. 1에서 이 계수를 뺀 값을 거리의 함수처럼 사용하는 것은 완전히 잘못된 적용인데, 이는 각도가 0이지만 [[노름|L2 놈]](norm)은 다른 두 벡터를 생각해보면 쉽게 알 수 있다. 정확한 거리 함수를 적용해도 서로 다른 이 두 벡터가 같은 것처럼 판단하게 될 것이다. 그러나 대부분의 경우 이것은 중요한 속성은 아니다. 벡터 집합 내에서의 상대적인 유사도나 거리만이 중요한 측정 대상인 상황에서는 어떤 함수를 적용하더라도 결과의 순서는 동일하기 때문이다.

== 속성 ==
코사인 유사도는 다음과 같이 [[유클리드 거리]]와 관계가 있다. 유클리드 거리를 |''A'' - ''B''|로 나타냈을 때, 다항식을 [[다항식 전개|전개]]하여 다음과 같은 식이 성립한다.

:<math>|A - B|^2 = (A - B)^\top (A - B) = |A|^2 + |B|^2 - 2 A^\top B</math>

''A''와 ''B''가 단위 거리에 대해 정규화되었을 때, |''A''| = |''B''| = 1이며 따라서 위의 식은 다음의 식과 동일하다.

:<math>2 (1 - \cos(A, B))</math>

== 같이 보기 ==
* [[해밍 거리]]
* [[상관분석|상관성]]
* [[유사도 학습]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} [https://web.archive.org/web/20131204130641/http://www.appliedsoftwaredesign.com/archives/cosine-similarity-calculator/ 온라인 코사인 유사도 계산기]
* {{언어링크|en}} [http://mathforum.org/kb/message.jspa?messageID=5658016&tstart=0 코사인 측정]
* {{언어링크|en}} [https://web.archive.org/web/20140310202211/http://pyevolve.sourceforge.net/wordpress/?p=2497 파이썬을 이용한 코사인 유사도 튜토리얼]

[[분류:정보 검색 기술]]
[[분류:유사도 척도]]