[Pytorch] 유사도(유클리드, 맨해튼, 코사인) 계산을 해보자

Meosun·2024년 8월 9일

AI Tech

목록 보기
3/4

Tensor들간의 거리를 계산하는 방법에 대해 알아보자

1.맨해튼 유사도

맨해튼 유사도(L1 노름)는 두 데이터간의 절대값 거리에 따른 유사도를 의미한다.

 distance(x,y)=i=1pxiyi\displaystyle\ distance(x,y) \displaystyle \displaystyle= \sum_{i=1}^{p}\vert{x_i-y_i}\vert
 sim(x,y)=1distance(x,y)\displaystyle\ sim(x,y) \displaystyle \displaystyle= \frac 1 {distance(x,y)}

이산형 데이터 및 이진형 데이터를 처리할때 사용이 많이된다.
그럼 Pytorch로 구현해보자

  • Pytorch Code
import torch
dist = torch.norm(A - B, p = 2) #거리
similarity = 1 / (1 + dist) # 유사도

위와 같이 단순하게 구현 가능하다.

2.유클리드 유사도

유클리드 유사도(L2 노름)는 두 데이터간의 직선거리에 따른 유사도를 의미한다.
유클리드 거리를 사용하기 위해서는 데이터를 정규화 해야하며, 데이터 차원이 증가할수록 사용하기 쉽지 않다.
우리가 많이 보던 피타고라스 정의와 유사하다.

 distance(x,y)=i=1p(xiyi)2\displaystyle\ distance(x,y) \displaystyle \displaystyle= \sum_{i=1}^{p}\sqrt{(x_i-y_i)^2}
 sim(x,y)=1distance(x,y)\displaystyle\ sim(x,y) \displaystyle \displaystyle= \frac 1 {distance(x,y)}

그럼 Pytorch로 구현해보자

  • Pytorch Code
import torch
dist = torch.norm(A - B, p = 1) #거리
similarity = 1 / (1 + dist) # 유사도

맨해튼 유사도와 코드가 거의 유사하다. 오직norm(p=1)로 변경해주면 된다.

3.코사인 유사도

코사인 유사도는 두개 벡터값에서 코사인 각도를 구한 방법으로 코사인 유사도가 1에 근접할 수록 두값은 유사한 것으로 본다.

 sim(x,y)=ABA2B2=i=1pAiBii=1pAi2i=1pBi2\displaystyle\ sim(x,y) \displaystyle \displaystyle= \frac {A*B} {\vert\vert{A}\vert\vert_2\vert\vert{B}\vert\vert_2} = \frac {\sum_{i=1}^{p}{A_iB_i}} {\sqrt{\sum_{i=1}^{p}{A_i^2}}\sqrt{\sum_{i=1}^{p}{B_i^2}}}

그럼 Pytorch로 구현해보자

  • Pytorch Code
import torch
dot_AB = torch.dot(A, B) # A와B의 내적 구하기
norm_A = torch.norm(A, p = 2) #A 자체적인 L2노름(유클리드)
norm_B = torch.norm(B, p = 2) #B 자체적인 L2노름(유클리드)
cosine_similarity = dot_AB / (norm_A * norm_B)
profile
데이터와 AI를 잘 활용하는 Backend Developer가 되자

0개의 댓글