관리 메뉴

bright jazz music

선형대수 : 15. 코사인 유사도(cosine similarity) 본문

Math/선형대수

선형대수 : 15. 코사인 유사도(cosine similarity)

bright jazz music 2022. 8. 3. 08:41

코사인 유사도(cosine similarity)

  • 코사인 유사도는 벡터 사이의 방향의 가까운 정도를 나타낸다.
  • 다음과 같이 요소 수가 2인 2차원 벡터 두 개가 존재한다고 가정하자.

  • 두 벡터 사이의 각도는 세타(θ)라고 가정하자.
  • 그렇다면 아래와 같은 그림을 그릴 수 있다.

 

내적 구하기

  • np.linalg.dot()을 통해 벡터의 내적을 구할 수 있다. 내적은 각 요소의 총합이다.

  • 위의 내적은 삼각함수와 L2 놈을 사용해서 구할 수도 있다.

 

삼각함수와 L2 놈을 사용한  내적 구하기

아래의 내용은 코사인 법칙 정리를 사용해서 증명 가능하다.

LaTeX 수식
$\vec{a}\cdot\vec{b} = ||\vec{a}||_{2}||\vec{b}||_{2} cos\theta = \sqrt{a_{1}^2 + a_{2}^2}\sqrt{b_{1}^2 + b_{2}^2}cos\theta$
 
  • 이 관계를 이용해서 cosθ 값을 구할 수 있다.
  • 아래를 보자.

 

LaTeX 수식
$\begin{align} \cos\theta = \frac{a_{1}b_{1} + a_{2}b_{2}}{\sqrt{a_{1}^2 + b_{1}^2} + \sqrt{a_{1}^2 + b_{1}^2}} \end{align}$
 

 

  • cosθ 값은 벡터 사이의 각도 θ 가 0일 때 최댓값, 즉 1을 취한다.
  • cosθ 값은 θ 값이 커짐에 따라 작아지게 된다.
  • 따라서 cosθ 은 두 벡터의 방향이 일치하는 정도를 알려준다.
  • θ가 0에 가까울 수록 cosθ 값이 커지며 두 벡터가 일치하는 정도가 높다.
  • θ가 커질수록 cosθ 값은 작아지며 두 벡터의 일치도도 낮아진다. 

 

n차원 벡터로의 확장

 

LaTeX 수식
$\begin{align}\cos\theta &= \frac{\sum_{k=1}^n a_{k}b_{k}}{\sqrt{\sum_{k=1}^n{a_{k}^2}}\sqrt{\sum_{k=1}^n{b_{k}^2}}}\\
\\&= \frac{\vec{a}\cdot\vec{b}}{||\vec{a}||_{2}||\vec{b}||_{2}} \end{align}$

 

  • 2차원 벡터의 경우, 코사인 유사도를 두 벡터가 이루는 각도를 이미지화 할 수 있었다. n차원 벡터의 경우에는 무엇을 의미할까?
  • 이를 도형으로 이미지화 하는 것은 어렵다. 
  • 그러나 2차원 벡터의 겨우처럼 벡터의 방향의 일치도를 표현하는 지표로 생각할 수 있다.
  • cosθ는 코사인 유사도라고 하며 2개 벡터의 방향의 일치도를 나타내는 지표로서 인공지능에서 자주 사용된다.
  • 자연어 처리와 같이 단어 사이의 관계성을 분석할 필요가 있는 분야가 그 예이다. 

 

파이썬에서의 코사인 유사도 계산

파이썬에서는 NumPy의 linalg.dot()와 linalg.norm()함수를 이용해서 코사인 유사도를 구할 수 있다.

 

#코사인 유사도 계산

import numpy as np

def cos_sim(vec_1, vec_2):
    #(두 벡터의 내적) / (두 벡터의 놈의 곱)
    return np.dot(vec_1, vec_2) / (np.linalg.norm(vec_1) * np.linalg.norm(vec_2))

a = np.array([2, 2, 2, 2])
b = np.array([1, 1, 1, 1])      #a와 같은 방향
c = np.array([-1, -1, -1, -1])  #a와 반대 방향

print("----- a와 b의 코사인 유사도 -----")
print(cos_sim(a, b))

print("----- a와 c의 코사인 유사도 -----")
print(cos_sim(a, c))



# ----- a와 b의 코사인 유사도 -----
# 1.0
# ----- a와 c의 코사인 유사도 -----
# -1.0
  • 벡터가 같은 방향인 경우 코사인 유사도는 최댓값이 1이 된다.
  • 벡터가 반대 방향인 경우 코사인 유사도는 최솟값 -1이 된다.

 

 

 

 

 

실습

벡터 a와 벡터 b의 코사인 유사도 계산

#코사인 유사도 계산

import numpy as np

def cos_sim(vec_1, vec_2):
    #(두 벡터의 내적) / (두 벡터의 놈의 곱)
    return np.dot(vec_1, vec_2) / (np.linalg.norm(vec_1) * np.linalg.norm(vec_2))

a = np.array([2, 0, 1, 0])
b = np.array([0, 1, 0, 2])

print("----- a와 b의 코사인 유사도 -----")
print(cos_sim(a, b))


# ----- a와 b의 코사인 유사도 -----
# 0.0

 

 

 

 

 

 

 

 

 

 

참고:

https://ko.wikipedia.org/wiki/%EC%BD%94%EC%82%AC%EC%9D%B8_%EC%9C%A0%EC%82%AC%EB%8F%84

 

 

 

 

 

Comments