Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

what i learned

[ML] 코사인 유사도 본문

Artificial Intelligence/Machine Learning

[ML] 코사인 유사도

햄식이111 2023. 11. 19. 20:04

코사인 유사도란?

두 벡터 사이의 사잇각을 구해서 두 벡터값이 서로 얼마나 유사한지 수치로 확인하는 방법이다.

위의 그림처럼 유사한 벡터들 사이의 ⍬값을 구하여 cos⍬값이 작을수록 유사한 벡터라는 것을 알 수 있다.

 

 

벡터에서 cos⍬값을 구하는 방법은 벡터 내적을 연산하는 공식을 통해 유추할 수 있다.

두 벡터A, B에 대해 내적을 수행하는 공식은

두 벡터 A, B의 크기와 cos⍬값을 곱하여 나타낸다.

 

 

위 수식을 cos⍬에 대해 풀어보면,

이러한 수식을 얻을 수 있다.

즉, cos⍬는 두 벡터의 내적을 총 벡터의 크기의 합으로 나눈 것이다.

 

그렇다면 유사도를 측정하는데 코사인유사도를 사용하는 이유는 무엇일까?

희소행렬에서의 유사도 측정 결과값이 다른 방법(유클리드 거리 기반 지표 등)보다 정확도가 높기 때문이다.

 

또한 문서에서 나타나는 단어의 빈도수에만 의존한다면 공정한 비교가 될 수 없기 때문이다.

예를 들어, A문서에 "머신러닝"이라는 단어가 5번 나오고 B문서에 "머신러닝"이라는 단어가 3번 나왔을 경우,

"머신러닝"이라는 단어의 빈도수가 5번이나 있는 A문서가 머신러닝과 밀접하게 관련된 문서라고 단정짓기는 어렵기 때문이다.

(A문서의 페이지가 300장이고 B문서가 1장으로 이루어진 문서일 경우, B문서가 머신러닝과 더 밀접한 문서일 확률이 높다.)

 

 

 

코드 예시

사이킷런에서 cos⍬값을 추출할 수 있도록 제공하는 cosine_similarity라는 API가 있다.

(이 함수의 반환값은 numpy.ndarray이므로 head와 같은 함수는 사용할 수 없다.)

💡 head와 같은 함수를 사용하고 싶다면 DataFrame으로 변환하거나 ndarrray형태에서 직접 원하는 부분만 슬라이싱해주면 된다.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 3개의 document를 임의로 생성하여 doc_list에 저장한다.
doc_list = ['if you take the blue pill, the story ends' ,
            'if you take the red pill, you stay in Wonderland',
            'if you take the red pill, I show you how deep the rabbit hole goes']

tfidf_vect_simple = TfidfVectorizer()
# feature vector로 변환한다.
feature_vect_simple = tfidf_vect_simple.fit_transform(doc_list)

# sklearn에서 제공하는 cosine_similarity API를 통한 유사도 확인
similarity_simple_pair = cosine_similarity(feature_vect_simple , feature_vect_simple)
print(similarity_simple_pair)
'''
[[1.         0.40207758 0.40425045]
 [0.40207758 1.         0.45647296]
 [0.40425045 0.45647296 1.        ]]
'''

위의 결과값을 더 설명하자면,

  1. if you take the blue pill, the story ends
  2. if you take the red pill, you stay in Wonderland
  3. if you take the red pill, I show you how deep the rabbit hole goes

3개의 문장을 서로 비교하여 유사도값이 나온 것이다.

  1번문장 2번문장 3번문장
1번문장 1 0.40207758 0.40425045
2번문장 0.40207758 1 0.45647296
3번문장 0.40425045 0.45647296 1

1번과 1번 문장은 같은 문장이므로 유사도가 당연히 1로 나오고

1번과 2번 문장을 비교했을 경우, 0.40207758 수치만큼 유사하며

1번과 3번 문장을 비교했을 경우, 0.40425045 수치만큼 유사하다는 것을 알 수 있다.

 

 

 

"파이썬 머신러닝 완벽 가이드"를 학습하여 기록한 글입니다.


공부한 내용을 기록하는 공간입니다.

잘못된 정보가 있을 경우 댓글로 피드백 주세요.

올바른 지식을 알려주셔서 감사합니다:)