수학/선형대수학

코사인 유사도(cosine similarity)/ 파이썬 구현

빛날희- 2021. 7. 13. 01:03

▶ 코사인 유사도란?

 

우리는 벡터 간 유사도를 측정함으로써 두 벡터가 얼마나 비슷한지를 알 수 있다. 그 유사도를 측정하는 방법 중 하나가 코사인 유사도이다. 

벡터가 "유사하다"는 것은 두 벡터의 길이와 방향이 비슷한 방향과 길이를 가진다는 의미이다. 코사인 유사도두 벡터의 방향, 즉 각도에 기초해서 유사도를 측정한다. 

 

 

다음과 같은 좌표들을 가진 세 벡터가 있다고 해보자. 

그림을 보면 A벡터와 B벡터가 A와 C벡터는 유사할 것으로 보인다. 코사인 유사도로 측정하였을 때에도 우리의 추측과 일치하는지 알아보자. 

 

 

 

▶ 코사인 유사도 공식

이때 각도 theta, 즉 v1과 v2 사이의 각도가 0에서 90도 사이이면 코사인 값이 +값이 나오고 90에서 180도 사이로 둔각이면 -값이 나온다. 따라서 코사인 유사도는 -1에서 +1사이의 값을 가진다. 

 

각도가 0에 가까울 수록(유사도가 +1에 가까울 수록) 두 벡터간 각도가 작다는 의미이므로 벡터 간 유사도가 크고, 각도가 180도에 가까울수록(유사도가 -1에 가까울 수록) 두 벡터간 각도가 크다는 의미이므로 벡터 간 유사도가 작다는 의미이다. 

 

 

▷ 코사인 유사도 공식 증명

코사인 유사도는 제 2 코사인 법칙에 의해 다음과 같이 증명될 수 있다. 

 

 

 

 

▶ 코사인 유사도 구현

코사인 유사도를 파이썬으로 구현해보았다. 

함수로 구현한 cosine_sim를 sckit-learn에선 cosine_similarity함수로 제공하고 있다.

 

 

 

이제 해당 함수와 sklearn의 함수를 통해 이번 포스팅에서 알아보고자 했던 벡터 A,B,C의 유사도를 측정해보자. 

 

우선 A와 B벡터의 유사도를 구해보자

구현한 함수로 구한 답과 sklearn으로 구한 유사도가 동일함을 볼 수 있다. 코사인 유사도 값이 약 0.98로 1에 아주 가까운 것을 볼 수 있다. 즉 A와 B 벡터가 매우 유사하다는 것을 알 수 있다.

 

이번에는 딱히 유사하지 않을 것 같다고 추측한 A와 C벡터의 유사도를 구해보자. 

A와 C의 유사도는 약 0.55로 A와 B의 유사도보다 현저히 유사성이 떨어지는 것을 확인할 수 있다. 처음 그래프를 보고 추측한 내용을 코사인 유사도 수치를 통해 확인할 수 있었다. 

 

 

 

 

이렇듯 우리는 코사인 유사도 값을 이용해 두 벡터 간 물리적 유사성을 알 수 있다.