[컴] cosine similarity - 코사인 유사도

추천시스템 만드는 법 / 추천 시스템



코사인 유사도

cosine similarity (코사인 유사도) 에 대해 알아보자.

코사인 테이블 을 보면서 이야기를 하자. 코사인은 직각삼각형에서 3개의 각이 있는데 각각의 각(angle) 에 대한 비율을 표시하는 방법으로 sin, cos, tan 라는 이름을 썼다. 그중에 (밑변/빗변) 을 cos(코사인) 이라고 정의했다.

이것을 두개의 벡터(vector) 가 같은 방향(orientation) 을 갖는지 여부를 판별하는 데 사용할 수 있다.

무슨 말인가 하면, 두개의 vector 의 방향이 같다면, 각도는 0도가 되고, cos(0)=1 이 된다. 만약 두개의 vector 의 방향이 90도를 이룬다면, cos(90)=0 이 될 것이다. 만약 vector 의 각도가 180도가 되면 어떨까? 이 때는 -1 이 된다.

정리하면, 두 vector 의 방향이 같으면, 1 이 되고, 점점 각도가 벌어질 수록 값은 작아지고, 결국 90도가 되면 0 이 되는 것이다.

이런 이유로 cos 의 값을 보면 vector 의 방향이 서로 얼마나 다른지를 판단할 수 있게 된다. 이런 식으로 vector 의 방향의 유사성을 판단하는 것을 ‘코사인 유사도’(cosine similarity) 라고 한다.

이런 코사인 유사도는 특히 결과가 "0이상 1이하([0, 1])" 인 positive space(양수공간)에서 많이 쓰인다.



유사도 계산

두 벡터의 스칼라 곱에서 '기하학적 정의' 를 보면 아래와 같이 '스칼라 곱'을 표현할 수 있다.

  • a ∙ b = ||a|| ||b|| cos(θ) 
이 식에서 cos(θ) 를 유도하게 된다. 아래는 ref. 2 에서 가져온 그림이다.
예를 들어 아래와 같은 vector 라면,
  • A = [1, 2]
  • B = [3, 4]
아래처럼 계산되어 진다.



즉, 벡터 A, B 의 유사성(similarity) 는


이 된다.(1 에 가까울 수록 더 유사도가 높다.)



추천 시스템

이것을 이용해서 추천시스템을 만들 수 있다. 추천시스템을 '취향' 이 비슷한 사람을 찾아주는 것이라고 보면 된다.

즉, '취향의 유사도'를 알아내는 것이다.

위와 같이 "한 개인의 취향"을 "한개의 벡터" 로 인식하는 것이다. 여기서 벡터의 구성요소는 각 영화에 대한 '별점' 이 된다.

우리가 흔히 벡터를 표현할 때 아래와 같이 표현한다.

  • vector = [v1, v2, v3..] 

이것은 '여러 방향'을 갖는 '여러 크기'들이 존재하는 것이다. 이런 '여러방향의 여러크기' 를 하나로 묶어서 '벡터' 로 본다.

이것을 '취향' 에 대입을 하면, 개인이 '여러 영화에 대해 매긴 별점' 을 하나로 묶어서 '벡터' 로 보는 것이다.

ref. 5 에서 구체적인 예와 python code 를 확인할 수 있으니 참고하자.



References

  1. Cosine similarity - Wikipedia, the free encyclopedia
  2. 코사인 유사도 - 위키백과, 우리 모두의 백과사전
  3. 삼각함수 공식 총정리 : 네이버 블로그
  4. 벡터(vector)의 길이
  5. Elliot Chance - How to Write Your Own Recommendation System

댓글 없음:

댓글 쓰기