유사도란?
Similairy 유사도란 상품 A와 상품 B라는 2개의 상품이 있을 때, 2가지 상품이 서로 얼마나 유사한지를 숫자로 표현한 값을 말한다.
유사도 측정방법에는 유클라디안 유사도(Euclidean Similarity), 코사인유사도(Cosine Similarity), 자카드 유사도(Jaccard Similarity), 맨하튼 거리(Manhattan distance), 피어슨 상관계수(Pearson Correlation Coefficient) 등 여러방법이 있다.
이번 포스팅에서는 코사인 유사도(Cosine Similarity), 유클라디안 유사도(Euclidean Similarity), 자카드 유사도(Jaccard Similarity)를 알아보고자 한다.
자카드 유사도(Jaccard Similarity)
자카드 유사도란 상품 A, 상품B의 합집합에서 교집합을 나눈 것이다.
이해하기 쉽게 A / B라는 2가지 주식 포트폴리오의 유사도를 측정한다고 해보자
A 주식 포트폴리오 | B 주식 포트폴리오 |
삼성전자, 삼성전자우, 네이버, 카카오, NC소프트 | 삼성전자, 삼성전자우, 삼성카드, 삼성생명, 카카오 |
- A / B 주식 포트폴리오의 합집합 : 7개
삼성전자, 삼성전자우, 네이버, NC소프트, 삼성카드, 삼성생명, 카카오
- A / B 주식 포트폴리오 교집합 : 3개
삼성전자, 삼성전자우, 카카오
자카드 유사도 계산
A/B 포트폴리오의 자카드 유사도 = 3 / 7 = 0.426
A/B 포트폴리오의 유사도는 42.6% 유사하다고 계산되었다.
import numpy as np
from sklearn.metrics import jaccard_score
y_true = np.array([[0, 1, 1],
[1, 1, 0]])
y_pred = np.array([[1, 1, 1],
[1, 0, 0]])
jaccard_score(y_true[0], y_pred[0])
Euclidean Similarity
Euclidean Similarity는 n 차원의 공간에서 2vector 사이의 최단 거리를 구하는 방법이다. 일반적인 유사도들은 0~1 혹은 -1 ~ 1 사이의 값을 가지는데 Euclidean Similiarity는 거리를 구하는 방법이기 때문에 값의 범위가 무한대이다.
그러므로 주로 L1 regularization을 이용해서 vector 요소 값의 합이 1이 되도록 vector 크기를 조절해 사용한다.
import numpy as np
# numpy arrays
point1 = np.array((1, 2, 3))
point2 = np.array((1, 1, 1))
# subtracting vector
temp = point1 - point2
# doing dot product
sum_sq = np.dot(temp.T, temp)
# Doing squareroot and
# printing Euclidean distance
print(np.sqrt(sum_sq))
코사인유사도(Cosine Similarity)
Cosine Similarity는 2가지 vector의 코사인 각도를 계산하여 유사성을 측정하는 방법이다.
코사인 함수가 0도일 때 값은 1, 90도일 때 0, 180도일 때 -1 값을 가지는 것처럼 2가지 벡터의 각도가 작아지면 유사하다고 판단, 멀어지면 유사하지 않다고 판단한다.
Cosine Similarity는 vector의 길이가 1이 되도록 정규화 시킨 뒤, 내적을 통해서 구할 수 있다.
- Cosine Similarity = 1, 코사인 유사도가 1에 가까울수록 유사하다
- Cosine Similarity = 0, 코사인 유사도가 0에 가까울수록 무관하다
- Cosine Similarity = -1, 코사인 유사도가 -1에 가까울수록 반대이다.
타겟 대상 1명 vs 비교 대상 1명의 유사도
from numpy import dot
from numpy.linalg import norm
List1 = [4, 47, 8, 3]
List2 = [3, 52, 12, 16]
result = dot(List1, List2)/(norm(List1)*norm(List2))
print(result)
타겟 대상 1명 vs 전체 대상(다수) 유사도
import numpy as np
List1 =np.array([[ 4, 45, 8, 4],
[ 2, 23, 6, 4]])
List2=np.array([ 2, 54, 13, 15])
similarity_scores = List1.dot(List2)/ (np.linalg.norm(List1, axis=1) * np.linalg.norm(List2))
print(similarity_scores)
'머신러닝딥러닝 > 딥러닝' 카테고리의 다른 글
[딥러닝] 심층신경망 은닉층 패션아이템 분류 - 혼자공부하는 딥러닝 (0) | 2022.12.01 |
---|---|
[딥러닝] 인공신경망 패션아이템 분류 - 혼자공부하는 딥러닝 (0) | 2022.11.30 |
t-SNE vs UMAP 차원 축소 알고리즘 알아보기 (0) | 2022.06.27 |
딥러닝(Deep Learning) #16 - RNN & CNN (0) | 2022.04.17 |
딥러닝(Deep Learning) #15 - RNN (0) | 2022.04.15 |
댓글