Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- GIT
- 자료구조와 함께 배우는 알고리즘 입문
- 선형대수
- 처음 만나는 AI 수학 with Python
- Kernighan의 C언어 프로그래밍
- /etc/network/interfaces
- 티스토리 쿠키 삭제
- 이터레이터
- baeldung
- 목록처리
- 스프링부트핵심가이드
- 스프링 시큐리티
- 친절한SQL튜닝
- 코드로배우는스프링부트웹프로젝트
- 알파회계
- 코드로배우는스프링웹프로젝트
- d
- 페이징
- 서버설정
- 처음 만나는 AI수학 with Python
- 데비안
- 구멍가게코딩단
- iterator
- network configuration
- ㅒ
- 자바편
- resttemplate
- 네트워크 설정
- 자료구조와함께배우는알고리즘입문
- 리눅스
Archives
- Today
- Total
bright jazz music
선형대수 : 15. 코사인 유사도(cosine similarity) 본문
코사인 유사도(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
'Math > 선형대수' 카테고리의 다른 글
선형대수: 14. 고윳값과 고유벡터, 그리고 고유 방정식 (2) (0) | 2022.08.02 |
---|---|
선형대수: 14. 고윳값과 고유벡터, 그리고 고유 방정식 (1) (0) | 2022.08.02 |
선형대수: 13. 표준기저 (Standard basis) (0) | 2022.08.01 |
선형대수: 12. 선형변환(linear transformation) (0) | 2022.07.30 |
선형대수: 11. 벡터 그리기 (화살표 그리기) (0) | 2022.07.30 |
Comments