Ch.4 벡터와 행렬 — 의미를 수학으로

코사인 유사도 — 단어 거리 측정

코사인 유사도의 수학적 정의와 직관을 이해한다NumPy로 두 벡터의 코사인 유사도를 계산할 수 있다유사도 히트맵을 해석하여 단어 관계를 파악한다

'왕'과 '여왕'은 얼마나 가까울까?

AI에게 '이 두 문장이 비슷한가?'라고 물으면 숫자로 답합니다. 0.95면 매우 비슷하고, 0.1이면 전혀 다르다는 뜻이죠.

벡터 사이의 '거리'를 어떻게 숫자 하나로 표현할 수 있을까?

코사인 유사도 — 두 벡터가 이루는 각도로 유사성을 측정하는 방법입니다.

lightbulb

핵심 개념

코사인 유사도

두 벡터 사이의 각도로 유사성을 측정하는 방법


article

핵심 내용

벡터가 같은 방향을 가리키면 유사도는 1에 가깝습니다

코사인 유사도는 두 벡터 사이의 각도(θ)를 측정합니다

0° → cos=1 (동일), 90° → cos=0 (무관)

코사인 유사도(Cosine Similarity), 내적(Dot Product), 노름(Norm)

1에 가까우면 → 의미가 비슷하다 (같은 방향) 0에 가까우면 → 의미가 무관하다 (직각) -1에 가까우면 → 의미가 반대다 (반대 방향)

코사인 유사도의 수학적 정의를 살펴봅시다

cos( heta) = rac ec{A cdot ecB}| ec{A| | ecB|}

분자는 두 벡터의 내적(각 원소끼리 곱한 후 합산), 분모는 각 벡터의 크기(노름)를 곱한 값입니다. 벡터의 크기를 나누어주기 때문에 방향만 비교합니다.

ecA cdot ecB = sum_i=1^n A_i imes B_i = A_1 B_1 + A_2 B_2 + cdots + A_n B_n

내적은 같은 위치의 원소끼리 곱한 후 모두 더합니다. 두 벡터가 같은 방향의 성분이 클수록 내적 값이 커집니다.

직접 코사인 유사도를 계산해봅시다

import numpy as np

def cosine_similarity(a, b):
    """두 벡터의 코사인 유사도 계산"""
    dot_product = np.dot(a, b)       # 내적
    norm_a = np.linalg.norm(a)       # A의 크기
    norm_b = np.linalg.norm(b)       # B의 크기
    return dot_product / (norm_a * norm_b)

# 간단한 단어 벡터 (가상)
king   = np.array([0.9, 0.8, 0.2])
queen  = np.array([0.85, 0.75, 0.8])
dog    = np.array([0.1, 0.2, 0.05])

print(f"왕 ↔ 여왕: {cosine_similarity(king, queen):.4f}")
print(f"왕 ↔ 개:   {cosine_similarity(king, dog):.4f}")
print(f"여왕 ↔ 개: {cosine_similarity(queen, dog):.4f}")

여러 단어 사이의 유사도를 한눈에 보여주는 히트맵입니다

대각선은 자기 자신과의 유사도(=1.0)입니다. '왕'과 '여왕'은 0.85, '왕'과 '개'는 0.1

AI는 유사도 행렬로 검색, 추천, 번역을 수행합니다

히트맵 읽는 법: 빨간색(1.0에 가까움) → 매우 유사 파란색(0에 가까움) → 거의 무관 대각선은 항상 1.0 (자기 자신)

순수 Python으로 코사인 유사도를 구현하고 다양한 벡터 쌍을 비교합니다

# 코사인 유사도 직접 구현
import math

def dot_product(a, b):
    return sum(x * y for x, y in zip(a, b))

def magnitude(v):
    return math.sqrt(sum(x**2 for x in v))

def cosine_similarity(a, b):
    mag_a, mag_b = magnitude(a), magnitude(b)
    if mag_a == 0 or mag_b == 0:
        return 0.0
    return dot_product(a, b) / (mag_a * mag_b)

# 테스트 벡터들
vectors = {
    "고양이": [0.9, 0.1, 0.8],
    "강아지": [0.85, 0.15, 0.75],
    "자동차": [0.1, 0.9, 0.2],
    "트럭":   [0.15, 0.85, 0.25],
}

print("=== 코사인 유사도 매트릭스 ===")
names = list(vectors.keys())
for i, n1 in enumerate(names):
    for j, n2 in enumerate(names):
        if i <= j:
            sim = cosine_similarity(vectors[n1], vectors[n2])
            print(f"  {n1} vs {n2}: {sim:.4f}")

두 문장의 코사인 유사도가 0.02라면 어떤 의미인가요?

코사인 유사도벡터의 크기(길이)에 영향을 받지 않고 방향만 비교한다.

코사인 유사도가 -1이면 두 벡터는 어떤 관계인가요?

코사인 유사도가 -1이면 두 벡터는 완전히 반대 방향을 가리킨다.

다음 코드의 빈칸을 채우세요. import numpy as np def cosine_sim(a, b): return np.dot(a, b) / (np.linalg._____(a) * np.linalg._____(b))

np.linalg._____(v)

동일한 두 벡터의 코사인 유사도는 항상 1이다.

코사인 유사도

key

핵심 용어

📐

코사인 유사도

두 벡터 사이의 각도로 유사성을 측정하는 방법

edit_note

정리 노트

코사인 유사도 핵심 정리

수학적 정의

공식
cos(θ) = A·B / (‖A‖ × ‖B‖) — 내적을 크기로 나눔
내적(Dot Product)
같은 위치 원소끼리 곱한 후 모두 더한 값
노름(Norm)
벡터의 크기(길이) — √(v₁² + v₂² + ...)

유사도 해석

1에 가까우면
같은 방향 → 의미가 비슷하다
0에 가까우면
직각(직교) → 의미가 무관하다
-1에 가까우면
반대 방향 → 의미가 반대다

코사인 유사도는 벡터의 크기(길이)에 영향받지 않고 방향만 비교합니다 — 이것이 유클리드 거리와의 핵심 차이!

image

시각 자료

다이어그램: py-scene-cosine
check_circle

핵심 정리

  • 1코사인 유사도 = 두 벡터 사이의 각도 기반 유사성 측정
  • 21이면 동일, 0이면 무관, -1이면 반대
  • 3히트맵으로 여러 단어 간 유사도를 한눈에 파악

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작