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 를 확인할 수 있으니 참고하자.
댓글 없음:
댓글 쓰기