최근 면접에서 추천시스템의 코사인유사도를 관한 질문을 받았고 개념 정리가 부족한 것을 느껴 내용을 정리하려고 한다.
코사인 유사도는 유사도를 측정하는 기법중의 하나로, 벡터간의 사잇각을 구하는 방법이다. 각도가 0도일 때 코사인 유사도는 1이고, 각도가 90도일 땐 0이 된다. 코사인유사도의 범위 0~1이 되며 벡터간의 각도를 기반으로 유사도를 측정하기 때문에 각각의 스케일의 영향을 받지 않는 것이 특징이다.
코사인 유사도의 수식은 다음과 같다.
풀이를 하면 분자부분에는 벡터의 내적을 구하고, 분모부분에는 벡터들의 크기의 곱이 들어갑니다.
a = np.dot(v1, v2)
b = (np.sqrt(sum(np.square(v1))) * np.sqrt(sum(np.square(v2))))
a / b
추천시스템에서 코사인 유사도를 사용하는 이유는 단어 빈도 기반으로 유사도를 측정하기 때문이다. 사용자가 각각의 아이템을 중첩하여 선택하는 경우가 많을수록 유사하다고 판단할 수 있고, 아이템과 사용자들은 주로 텍스트 데이터로 존재하기 때문이다.
코사인 유사도를 활용하여 유사도를 구할 때 각도를 초점으로 판단하기 때문에 각각의 텍스트를 비교하기 위해 생기는 많은 차원속에서 스케일의 영향을 받지않는 다는 점이 중요하다.