코사인 유사도·거리 계산기 쉽게 이해하기 — 개념과 원리
코사인 유사도는 두 벡터의 길이와 상관없이 방향이 얼마나 비슷한지를 재는 값입니다. 검색 엔진과 추천 시스템에서 문장 임베딩, 문서의 단어 빈도 벡터, 사용자 선호 벡터를 비교하는 표준 방법입니다. 이 계산기는 함께 내적, 유클리드 거리(직선 거리), 맨해튼 거리(격자 거리)도 보여 주는데, 이 값들은 벡터의 크기에 영향을 받습니다.
계산 방법
길이가 같은 두 벡터 A = (a₁, …, aₙ), B = (b₁, …, bₙ)에 대해 다음과 같이 계산합니다.
- 내적 A·B = Σ aᵢbᵢ
- 코사인 유사도 = A·B ÷ (‖A‖ × ‖B‖), 여기서 ‖A‖ = √(Σ aᵢ²)는 벡터의 크기입니다.
- 유클리드 거리 = √(Σ (aᵢ − bᵢ)²)
- 맨해튼 거리 = Σ |aᵢ − bᵢ|
원리
내적은 ‖A‖ × ‖B‖ × cos θ와 같고, θ는 두 벡터가 이루는 각입니다. 두 크기로 나누면 cos θ만 남아, 방향이 같으면 1, 수직이면 0, 정반대면 −1이 됩니다. 그래서 같은 주제를 다룬 긴 문서와 짧은 문서가 비슷하게 나와야 하는 텍스트 비교에 잘 맞습니다. 유클리드 거리는 두 점 사이가 얼마나 떨어져 있는지를 재므로 한 벡터의 크기만 바꿔도 값이 달라집니다. 두 벡터를 크기 1로 정규화하면 유클리드 거리의 제곱 = 2 − 2 × 코사인 유사도라는 관계가 성립합니다.
예제 풀이
- A = (1, 2, 3, 4), B = (2, 3, 4, 5)입니다.
- 내적은 2 + 6 + 12 + 20 = 40입니다.
- ‖A‖ = √30 = 5.4772, ‖B‖ = √54 = 7.3485이므로 둘의 곱은 √1,620 = 40.249입니다.
- 코사인 유사도는 40 ÷ 40.249 = 0.99381이며, 각도로는 약 6.4°입니다.
- 성분 차이가 모두 1이므로 유클리드 거리는 √4 = 2, 맨해튼 거리는 1 + 1 + 1 + 1 = 4입니다.
결과 해석
두 벡터는 2만큼 떨어져 있지만 코사인 유사도 0.994로 방향은 거의 같습니다. 단어 빈도처럼 음수가 없는 자료에서는 코사인 유사도가 0~1 범위에 있습니다. 임베딩에서는 어느 정도를 "비슷하다"고 볼지가 모델마다 다르므로, 고정된 기준보다 같은 모델 안에서 점수를 서로 비교하는 것이 좋습니다. 실측값처럼 절대 크기가 중요하면 유클리드나 맨해튼 거리를 쓰시기 바랍니다.
흔한 실수
- 서로 다른 임베딩 모델에서 나온 벡터를 비교하는 경우
- 코사인 유사도를 백분율이나 확률로 해석하는 경우
- 방향이 없는 영벡터에 코사인 유사도를 적용해 정의되지 않는 값이 나오는 경우
자주 묻는 질문
코사인 거리는 무엇인가요?
보통 1 − 코사인 유사도로 정의합니다. 순위를 매기는 데는 유용하지만 삼각 부등식은 성립하지 않습니다.
코사인 유사도와 피어슨 상관계수는 같은가요?
각 벡터에서 평균을 뺀 뒤 구한 코사인 유사도가 피어슨 상관계수입니다.
검색할 때 코사인과 내적 중 무엇이 빠른가요?
모든 벡터를 미리 크기 1로 정규화해 두면 내적이 곧 코사인 유사도이므로 내적만 계산하면 됩니다.
출처: C. D. Manning, P. Raghavan and H. Schütze, Introduction to Information Retrieval, Cambridge University Press, 2008 · G. Strang, Introduction to Linear Algebra, Wellesley-Cambridge Press