[Vector] Cosine & L2 similarity 계산

JAsmine_log·2025년 3월 6일

similairy 비교

# 코사인 유사도 계산 함수
def calc_cosine_similarity(v1, v2):
    dot_product = np.dot(v1, v2)
    norm_v1 = np.linalg.norm(v1)
    norm_v2 = np.linalg.norm(v2)
    return dot_product / (norm_v1 * norm_v2)
    
# L2 거리 계산 함수
def calc_l2_distance(v1, v2):
    return np.linalg.norm(v1 - v2)
    
v1 = np.array([1, 2])
v2 = np.array([2, 4])  # v1의 2배
v3 = np.array([5, 10])  # v1의 5배

# 기준 벡터
base_vector = np.array([1, 0])
angles = [0, 30, 45, 60, 90, 120, 135, 150, 180]
vectors = []

doc1 = "인공지능은 컴퓨터 과학의 한 분야입니다"  # 짧은 문서
doc2 = "인공지능은 컴퓨터 과학의 한 분야입니다. 인공지능은 기계가 학습하고 문제를 해결할 수 있게 합니다"  # 긴 문서
doc3 = "자연어 처리는 컴퓨터가 인간의 언어를 이해하도록 하는 기술입니다"  # 다른 주제

위의 식을 활용해서 아래의 케이스들을 얻을 수 있다.

예제 1: 크기는 다르지만 방향이 같은 벡터

  • 벡터 v1: [1 2], 크기: 2.24
  • 벡터 v2: [2 4], 크기: 4.47
  • 벡터 v3: [ 5 10], 크기: 11.18
  • 코사인 유사도 (v1, v2): 1.000000
  • 코사인 유사도 (v1, v3): 1.000000
  • 코사인 유사도 (v2, v3): 1.000000
  • L2 거리 (v1, v2): 2.24
  • L2 거리 (v1, v3): 8.94
  • L2 거리 (v2, v3): 6.71

예제 2: 다양한 각도의 2차원 벡터

  • 각도 0° 벡터: [1.00, 0.00], 코사인 유사도: 1.000000
  • 각도 30° 벡터: [0.87, 0.50], 코사인 유사도: 0.866025
  • 각도 45° 벡터: [0.71, 0.71], 코사인 유사도: 0.707107
  • 각도 60° 벡터: [0.50, 0.87], 코사인 유사도: 0.500000
  • 각도 90° 벡터: [0.00, 1.00], 코사인 유사도: 0.000000
  • 각도 120° 벡터: [-0.50, 0.87], 코사인 유사도: -0.500000
  • 각도 135° 벡터: [-0.71, 0.71], 코사인 유사도: -0.707107
  • 각도 150° 벡터: [-0.87, 0.50], 코사인 유사도: -0.866025
  • 각도 180° 벡터: [-1.00, 0.00], 코사인 유사도: -1.000000

예제 3: 길이가 다른 유사한 문서

  • 문서1 단어 수: 5
  • 문서2 단어 수: 13
  • 문서3 단어 수: 8
  • 문서 벡터1 크기: 2.24
  • 문서 벡터2 크기: 3.87
  • 문서 벡터3 크기: 2.83
  • 문서1-문서2 코사인 유사도: 0.692820
  • 문서1-문서3 코사인 유사도: 0.000000
  • 문서2-문서3 코사인 유사도: 0.000000
  • 문서1-문서2 L2 거리: 2.83
  • 문서1-문서3 L2 거리: 3.61
  • 문서2-문서3 L2 거리: 4.80

예제 4: 정규화된 벡터와 원래 벡터 비교

  • 벡터 a: [4 3 2], 크기: 5.39
  • 벡터 b: [8 6 4], 크기: 10.77
  • 벡터 c: [2 3 4], 크기: 5.39
  • 정규화된 a: [0.74, 0.56, 0.37], 크기: 1.00
  • 정규화된 b: [0.74, 0.56, 0.37], 크기: 1.00
  • 정규화된 c: [0.37, 0.56, 0.74], 크기: 1.00
  • 원래 벡터 코사인 유사도 (a, b): 1.000000
  • 정규화된 벡터 코사인 유사도 (a_norm, b_norm): 1.000000
  • 원래 벡터 코사인 유사도 (a, c): 0.862069
  • 정규화된 벡터 코사인 유사도 (a_norm, c_norm): 0.862069
  • 원래 벡터 L2 거리 (a, b): 5.39
  • 정규화된 벡터 L2 거리 (a_norm, b_norm): 0.000000

Appendix


(자료: https://www.learndatasci.com/glossary/cosine-similarity/)

profile
Everyday Research & Development

0개의 댓글