본문 바로가기
딥러닝/자연어처리

코사인 유사도 (Cosine Similarity)

by 달죽 2020. 12. 1.
반응형

 

문서를 유사도를 기준으로 분류 혹은 그룹핑을 할 때 유용하게 사용할 수 있는 코사인 거리(Cosine Distance) 입니다.

코사인 유사도(Cosine Similarity)는 특징 벡터 X, Y 에 대해서 

 

벡터의 곱(X*Y) 두 벡터의 L2 norm (즉, 유클리드 거리) 의 곱으로 나눈 값입니다. 

 

 

벡터의 곱(X*Y) 
-------------------
벡터의 L2 norm (즉, 유클리드 거리)

 

 

 

Cosine Similarity (d1, d2) =  Dot product(d1, d2) / ||d1|| * ||d2||

Dot product (d1,d2) = d1[0] * d2[0] + d1[1] * d2[1] * … * d1[n] * d2[n]
||d1|| = square root(d1[0]2 + d1[1]2 + ... + d1[n]2)
||d2|| = square root(d2[0]2 + d2[1]2 + ... + d2[n]2)

 

예시를 들어보겠습니다. 

 

a = np.array([3, 45, 7, 2])
b = np.array([2, 54, 13, 15])
import numpy as np
from math import*
 
def square_rooted(x):
 
    return round(sqrt(sum([a*a for a in x])),3)
 
def cosine_similarity(x,y):
 
    numerator = sum(a*b for a,b in zip(x,y))
    denominator = square_rooted(x)*square_rooted(y)
    
    return round(numerator/float(denominator),3)
 
print(cosine_similarity(a, b))

0.972

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * (np.linalg.norm(b)))

print(cosine_similarity(a, b)) 

0.9722842517123499

 

 

* np.linalg.norm

 

Norm이란 무엇일까?

Norm은 선형대수에서 벡터공간에서 벡터의 크기 또는 길이를 측정할 때 사용되는 개념
벡터에 절대값을 취한뒤 다 더해준다. 이것은 양수가 나오며 길이나 크기를 측정하게 된다. 

 

 

 

import scipy.linalg as linalg 

#np.linalg와 scipy.linalg에서 선형대수를 수행할 수 있다.

norm1 = linalg.norm(x,1)          # L1 norm   == sum(np.abs(x))
norm2 = linalg.norm(x)            # L2 norm   == np.sqrt(sum(x*x))
normp = linalg.norm(x,p)          # p norm
normMax = linalg.norm(x,np.inf)   # max norm  == np.max(abs(x))

 

from scipy.spatial.distance import cosine

print(cosine(a, b)) #0.2525906813163403 #코사인 거리
print(1 - cosine(a, b)) #0.7474093186836597 #코사인 유사도

0.02771574828765

0.97228425171235

 

그리고 코사인 거리(Cosine Distance)는 '1 - 코사인 유사도(Cosine Similarity)' 로 계산합니다. 

 

 

 

참고 rfriend.tistory.com/319

janav.wordpress.com/2013/10/27/tf-idf-and-cosine-similarity/

반응형

댓글