Cosine Similarity
코사인 유사도는 주어진 두 벡터 사이의 유사도를 의미합니다. 간혹 두 벡터 사이의 거리라고 소개하기도 하지만 엄밀히 말하면 거리는 아니고(삼각부등식 성립이 안됩니다) , 방향성이 얼마나 일치하는지를 측정하고 이를 바탕으로 유사도로 해석하는 것으로 생각하면 좋을 것 같습니다.
코사인 유사도의 활용법은 벡터로 표현된 데이터의 유사도를 측정하는데 활용할 수 있을 것 같습니다. 자연어처리에서 Word2vec과 같은 단어 임베딩으로 표현된 단어들 사이의 유사도를 측정하는 것들이 대표적인 사용예가 될 것 같습니다.
코사인 유사도의 공식은 다음과 같습니다.
s i m i l a r i t y = c o s ( Θ ) = A ⋅ B ∥ A ∥ ∥ B ∥ = ∑ i = 1 n ( A i × B i ) ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 \displaystyle similarity = cos(\Theta) = \frac{A \cdot B}{\| A \| \| B \|} = \frac{\sum_{i=1}^{n}(A_i \times B_i)}{\sqrt{\sum_{i=1}^{n}(A_i)^2} \times \sqrt{\sum_{i=1}^{n}(B_i)^2}} s i m i l a r i t y = c o s ( Θ ) = ∥ A ∥ ∥ B ∥ A ⋅ B = ∑ i = 1 n ( A i ) 2 × ∑ i = 1 n ( B i ) 2 ∑ i = 1 n ( A i × B i )
두 벡터가 완전하게 동일하다면 1, 완전하게 반대 방향이라면 -1, 그 사이는 얼마나 유사한지를 나타내게 됩니다.
왜 거리가 아니라 유사도가 정확한 용어일까?
거리라는 용어가 정확히 사용되려면 삼각부등식을 만족해야 한다고 합니다. 삼각부등식은 아래와 같습니다.
∥ A ∥ + ∥ B ∥ ≥ ∥ A + B ∥ \displaystyle \|A \| + \|B\| \geq \|A + B\| ∥ A ∥ + ∥ B ∥ ≥ ∥ A + B ∥
두 벡터의 합의 거리(norm)는 각 벡터의 거리(norm)의 합보다 작아야 합니다.
그런데, similarity는 다음의 예와 같이 이 삼각부등식을 만족하지 못한다고 합니다.
다음의 3점 A, B, C를 고려해봅시다.
A = ( 1 , 0 ) A = (1,0) A = ( 1 , 0 )
B = ( 1 , 1 ) B = (1,1) B = ( 1 , 1 )
C = ( 0 , 1 ) C = (0,1) C = ( 0 , 1 )
삼각부등식에 해당하는 거리를 구해봅시다.
s i m l i l a r i t y ( A , B ) = 1 − 2 2 \displaystyle simlilarity(A,B) = 1 - \frac{\sqrt{2}}{2} s i m l i l a r i t y ( A , B ) = 1 − 2 2
s i m l i l a r i t y ( B , C ) = 1 − 2 2 \displaystyle simlilarity(B,C) = 1 - \frac{\sqrt{2}}{2} s i m l i l a r i t y ( B , C ) = 1 − 2 2
s i m l i l a r i t y ( A , C ) = 1 \displaystyle simlilarity(A,C) = 1 s i m l i l a r i t y ( A , C ) = 1
그러면 다음의 식을 얻을 수 있습니다.
s i m i l a r i t y ( A , B ) + s i m i l a r i t y ( B , C ) = 2 − 2 < 1 = s i m i l a r i t y ( A , C ) similarity(A,B) + similarity(B,C) = 2 - \sqrt{2} < 1 = similarity(A,C) s i m i l a r i t y ( A , B ) + s i m i l a r i t y ( B , C ) = 2 − 2 < 1 = s i m i l a r i t y ( A , C )
위와 같은 이유로 엄밀히 말하면 '거리'보다는 '유사도'가 더 적합한 용어라고 합니다. (그런데, 저도 막 혼용해서 씁니다.)