AI 수학 로드맵 노트 5 — 내적과 코사인 유사도, 방향이 비슷하면 취향도 비슷하다

표 3 · 도식 1작성 Rhymbro

제1원리 질문. 두 데이터의 ‘닮음’을 거리 말고 다른 방법으로 잴 수는 없는가. 크기는 달라도 같은 방향을 가리키는 두 벡터가 있다. 예를 들어 영화를 적게 본 사람과 많이 본 사람의 취향이 같을 수 있다. 크기를 지우고 방향만 비교하는 도구가 내적과 코사인 유사도다.

벡터 a=(1,2,3)과 b=(4,5,6)의 칸별 곱과 합으로 내적을 구하는 표
개념도 — 내적 계산. 본문 내용을 바탕으로 자체 제작

핵심 — 곱해서 더하기

로드맵은 20주차 내적을 “곱해서 더하기 — AI에서 가장 많이 쓰는 연산”, 21주차 코사인 유사도를 “방향이 비슷하면 취향도 비슷하다”로 요약한다. 내적은 같은 칸끼리 곱해서 모두 더한 값이다.

칸 a b ai × bi
1 1 4 4
2 2 5 10
3 3 6 18
합 (내적) 32

코사인 유사도는 내적을 두 벡터의 길이(노름)로 나눈 값이다. cos θ = (a · b) / (|a| |b|). 길이로 나누면 크기 정보가 사라지고 방향의 차이(사이각 θ)만 남는다. 값의 범위는 −1부터 1까지다.

코사인 유사도 값 읽는 법사이각 θ에 따라 값이 정해진다사이각코사인 값해석같은 방향0°1완전히 같은 방향직각90°0관련 없음반대 방향180°−1정반대

아래 코드의 세 결과(0.9746, 1.0, 0.0)가 각각 ‘거의 같은 방향’, ‘같은 방향’, ‘직각’에 해당한다.

코드로 번역하기

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 내적: 같은 칸끼리 곱해서 모두 더한다
print(1*4 + 2*5 + 3*6)            # 32
print(np.dot(a, b))               # 32

# 코사인 유사도 = 내적 / (a의 길이 * b의 길이)
def cos_sim(u, v):
    return np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))

print(round(cos_sim(a, b), 4))            # 0.9746  (방향이 거의 같음)
print(round(cos_sim(a, 2 * a), 4))        # 1.0     (길이만 다르고 방향 같음)
print(round(cos_sim(np.array([1, 0]), np.array([0, 1])), 4))  # 0.0 (직각)

실행 결과

32
32
0.9746
1.0
0.0

사례 적용 — 길이는 달라도 방향이 같으면 1

두 번째 결과가 핵심이다. a와 2a는 길이가 두 배 차이 나지만 코사인 유사도는 1.0이다. 영화 평점 벡터에 비유하면, 같은 장르 비율로 영화를 보는 두 사람은 본 편수가 달라도 취향이 같다고 판정된다. 거리(노름)로 비교했다면 두 사람은 멀리 떨어져 있다고 나왔을 것이다.

로드맵이 32주차 미니 프로젝트를 ‘영화 취향 벡터 + 코사인 유사도 추천 시스템’으로 잡은 이유가 여기 있다. 또 내적은 다음 편의 행렬곱과 신경망에서 ‘행 × 열’ 계산 하나하나가 모두 내적이라는 점에서, 로드맵 전체에서 가장 자주 반복되는 연산이 된다.

1분 개념 체크

로드맵 교재 템플릿의 ‘1분 개념 체크’ 형식을 빌려 스스로 확인할 문제 두 개를 만들었다.

질문 답 근거
(1, 0, 2)와 (3, 5, 1)의 내적은? 5 1×3 + 0×5 + 2×1
(2, 2)와 (5, 5)의 코사인 유사도는? 1 길이만 다르고 방향이 같음

내 해석 — Rhymbro가 읽은 것

내적을 ‘가중 합’으로 읽으니 익숙한 계산이 떠올랐다. 부품별 수량 벡터와 단가 벡터의 내적은 총 원가이고, 성분별 비율 벡터와 물성 벡터의 내적은 혼합물의 추정 물성이다. AI에서 가장 많이 쓴다는 연산이 BOM 원가 계산과 같은 구조라는 게 이번 정리의 발견이었다.

반대로 코사인 유사도는 ‘규모를 무시한다’는 점이 장점이자 약점이다. 규모 자체가 중요한 비교(예: 생산량이 큰 라인과 작은 라인)라면 거리와 함께 봐야 한다고 생각한다.

한계로, 코사인 유사도는 영벡터(모든 칸이 0)에서 길이가 0이 되어 나눗셈이 정의되지 않으므로, 실제 코드에서는 이 경우를 따로 처리해야 한다.

요약

항목 정리
내적 같은 칸끼리 곱해서 더함, np.dot(a, b)
코사인 유사도 내적 / (|a| |b|)
값 범위 −1 ~ 1, 1이면 같은 방향
특징 길이를 지우고 방향만 비교

그래서 나는 무엇을 하기로 했나

이번 주는 좋아하는 책 장르 비율을 벡터 세 개로 만들어 서로의 코사인 유사도를 계산하고, 거리(노름)로 비교했을 때와 순위가 어떻게 달라지는지 확인하기로 했다.

주제와 순서는 개인 학습용으로 정리한 104주 AI 수학 로드맵 목차를 따랐고, 설명과 예제는 그 목차를 바탕으로 내 언어로 다시 썼다. 코드는 Python 3 + NumPy 2.x에서 실행해 출력을 확인했으며, 예시 수치는 설명용 가정 값이다.

함께 읽기: AI 수학, 네 기둥만 먼저 세운다 — 내가 잡은 로드맵

같은 카테고리에서 함께 읽기

강의자료 121편

4개의 댓글

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다