5 minute read

📌 오늘의 학습 목표

  • 벡터(Vector)스칼라(Scalar) 의 개념적 차이를 이해함.
  • 파이썬 기반의 오픈소스 수학 소프트웨어인 SageMath를 활용하여,
    1. 3차원 공간에서 두 벡터의 내적(Dot Product) 을 계산함.
    2. 4차원 공간에서 임의의 두 벡터에 대한 정사영(Projection) 을 실습함.

1. 벡터(Vector)와 스칼라(Scalar)의 이해

수학이나 물리를 오랫동안 접하지 않았다면 ‘벡터’, ‘스칼라’라는 단어가 낯설 수 있음. 아주 쉽게 말해서 이 둘은 “우리가 세상을 측정하고 표현하는 두 가지 방식”이라고 생각하면 됨.

🟡 스칼라 (Scalar) : “오직 크기만 있는 단순한 숫자”

  • 스칼라는 방향은 상관없고, “얼마나 큰가(크기, 양)?”만 나타내는 아주 단순한 정보임.
  • 우리가 일상에서 가장 흔하게 쓰는 일반적인 숫자 단위들이 대부분 스칼라임.
  • 일상 속의 예시:
    • “지금 내 몸무게는 70kg이다.” (어떤 방향으로 70kg인지 묻지 않음. 그냥 70이라는 크기만 중요함)
    • “오늘 기온은 25도이다.” (위치만 있을 뿐, 온도가 향하는 방향은 없음)
    • “영화 상영 시간은 120분이다.”
  • 인공지능이나 컴퓨터 프로그래밍에서는 단순한 실수 하나(예: 3.14, 100 등)를 스칼라라고 부름.

🔵 벡터 (Vector) : “크기 + 방향표시등이 달린 화살표”

  • 벡터는 크기에 더해서 “어느 방향으로?” 향하는지까지 함께 담고 있는 종합 정보 세트임.
  • 머릿속으로 ‘화살표’를 떠올리면 됨. 이 화살표는 “화살표의 길이(크기)”와 “화살표가 가리키는 곳(방향)” 두 가지 정보를 한 번에 갖고 있음.
  • 일상 속의 예시:
    • 스칼라(속력): “내 차는 지금 시속 100km로 달리고 있다.” (어디로 가는지는 모름)
    • 벡터(속도): “내 차는 지금 시속 100km로 달려서 남쪽으로 가고 있다.”
    • (크기: 100km, 방향: 남쪽 → 이 두 개가 합쳐져서 벡터가 됨)
  • 컴퓨터 안에서 벡터를 표현할 때는 화살표를 그릴 수 없으니, 칸이 여러 개 나눠진 배열(리스트) 형태로 나타냄.
    • 예를 들어 평면(2차원)에서는 [x축, y축]의 형태로 [3, 4]라고 쓰면 원점(0,0)에서 (3,4) 지점을 향하는 화살표를 의미함.
    • 인공지능은 수백, 수천 개의 특징 정보를 다루기 때문에 [키, 몸무게, 나이, 소득...] 처럼 칸이 굉장히 많은 초고차원 벡터 배열을 사용함.

2. 벡터의 내적 (Dot Product) 실습

내적(Dot Product)이라는 단어의 한자 ‘내(內)’는 안쪽을 의미함. 쉽게 설명하면 “두 개의 화살표(벡터)가 서로 얼마나 같은 방향을 바라보고 있는가?”를 하나의 스칼라 숫자(크기)로 꾹 압축해서 계산해 내는 수학적 약속임.

  • 두 벡터가 가리키는 방향이 비슷하면(각도가 좁으면) 내적 값은 큰 양수가 됨. (유사하다!)
  • 두 벡터가 가리키는 방향이 수직(90도)이면 내적 값은 0이 됨. (서로 완전 무관하다!)
  • 두 벡터가 반대 방향을 향하고 있으면 내적 값은 음수가 됨. (완전 반대 성향이다!)
  • 인공지능에서는 이 성질을 이용해 두 문서의 내용이 비슷한지(유사도 분석), 두 사람의 취향이 비슷한지를 계산할 때 밥 먹듯이 사용함.

계산하는 방법은 아주 간단함. 서로 짝꿍이 되는 같은 위치의 숫자끼리 곱한 다음에, 그 결과들을 모두 더해주면 됨!

💡 일상 속의 쉬운 예시: 넷플릭스 영화 성향 분석

벡터 내적이 인공지능에서 어떻게 “유사도(얼마나 닮았나)”를 측정하는지 영화 추천 상황을 가정해봄. 세 가지 장르(액션, 로맨스, 코미디)에 대해 평가를 남길 때, +1 (좋음), 0 (안봤음/보통), -1 (싫음) 이라고 숫자를 매긴다고 상상해봄.

  • A사람의 취향 벡터: [액션: +1, 로맨스: -1, 코미디: +1]
  • B사람의 취향 벡터: [액션: +1, 로맨스: -1, 코미디: 0]
  • C사람의 취향 벡터: [액션: -1, 로맨스: +1, 코미디: 0]

이제 어느 두 사람의 내적을 구해서 과연 누가 더 찰떡궁합인지 알아봄!

  • A와 B의 내적: (1 * 1) + (-1 * -1) + (1 * 0) = 1 + 1 + 0 = 2 (큰 양수) → 두 사람 모두 액션을 좋아하고(+1), 로맨스를 싫어하는(-1*-1=+1) 취향까지 똑같아서 곱한 결과가 긍정적 시너지를 내어 플러스(+)가 됨. 즉, A와 B는 취향이 아주 비슷함!

  • A와 C의 내적: (1 * -1) + (-1 * 1) + (1 * 0) = -1 + (-1) + 0 = -2 (음수) → 한 명이 액션을 좋아하면 다른 한 명은 싫어하고, 로맨스 취향도 엇갈림. 완전 정반대 성향이어서 곱할수록 점수가 깎이며 마이너스(-)가 됨!

이렇듯 컴퓨터는 복잡하게 사람의 심리를 분석하지 않고, 단순히 취향을 숫자로 바꾼 뒤 “내적 값이 양수로 큰가? 음수인가?”만 보고 두 사람에게 같은 영화를 추천해 줄지 말지 결정하는 것임!

(아래는 A, B, C 세 사람의 취향 벡터를 3차원 공간(액션, 로맨스, 코미디 축)에 화살표로 나타낸 시각화 그래프임)
영화 취향 벡터 시각화


🧮 3차원 공간에서의 벡터 내적 (in SageMath)

SageMath는 파이썬(Python) 문법을 쉽게 사용할 수 있는 수학 계산 프로그램임. 위에서 말한 짝꿍 곱셈 후 덧셈을 컴퓨터가 어떻게 뚝딱 해내는지 실습해봄.

# SageMath 환경에서 실행
# 3차원 공간([x, y, z] 처럼 3개의 칸이 있는 벡터)에서 두 벡터 u와 v를 만듦
u = vector(QQ, [2, -1, 3])  # x로 2, y로 -1, z로 3만큼 가는 화살표
v = vector(QQ, [4, 5, -2])  # x로 4, y로 5, z로 -2만큼 가는 화살표

print(f"벡터 u: {u}")
print(f"벡터 v: {v}")

# 두 벡터의 내적을 구하라는 명령어(.dot_product) 사용
dot_product = u.dot_product(v)

print(f"u와 v의 내적: {dot_product}")

💡 계산 과정 쪼그라보기 (컴퓨터가 한 일)

  1. 첫 번째 칸(x)끼리 곱함: 2 * 4 = 8
  2. 두 번째 칸(y)끼리 곱함: -1 * 5 = -5
  3. 세 번째 칸(z)끼리 곱함: 3 * -2 = -6
  4. 이 세 개를 모두 더함: 8 + (-5) + (-6) = -3
    • 두 벡터의 방향 씽크로율(유사도)을 나타내는 단 하나의 스칼라 숫자는 -3으로 계산됨!

3. 벡터의 정사영 (Projection) 실습

정사영(Projection)은 한자 그대로 ‘바르게(直) 비추는 그림자(影)’라는 뜻임. 천장에 아주 밝고 평평한 조명이 켜져 있다고 상상해봄. 대각선으로 기울어진 막대기(벡터 b)가 있을 때, 그 막대기의 그림자가 방바닥(기준이 되는 벡터 a)에 일직선으로 쭉 떨어져서 맺히게 됨. 이 바닥에 맺힌 그림자 막대기를 구하는 과정이 정사영임.

정사영을 왜 쓸까? 어떤 복잡한 데이터(허공에 떠있는 막대기)에서 내가 관심 있는 특정 측면(방바닥)의 정보만 쪽 빼내고 싶을 때 사용함.

정사영 계산 공식 (단 3단계):

  1. 내 데이터(벡터 b)와 관심 있는 바닥(벡터 a)이 얼마나 비슷한지 내적을 구함 (분자).
  2. 바닥(벡터 a) 자기 자신의 길이(크기)를 내적을 통해 구함 (분모).
  3. 위에서 나눈 비율(그림자가 바닥의 몇 배 크기인지)을 다시 바닥(벡터 a)에 곱해줌.

🧮 4차원 공간에서의 정사영 실습 (in SageMath)

우리는 3차원 공간(가로, 세로, 높이)에 살고 있어서 4차원은 상상할 수 없음. 하지만 수학 공식과 컴퓨터의 배열 연산은 3차원이든, 4차원이든, 100차원이든 방사선 사진을 찍듯이 그림자(정사영)를 정확하게 계산할 수 있음. 칸만 4개로 늘어난 것뿐임.

# SageMath 환경에서 실행
# 4차원(칸이 4개) 공간에서의 벡터 두 개 준비 
a = vector(QQ, [1, 2, 0, -1])  # 방바닥 역할! (기준 벡터)
b = vector(QQ, [3, 1, 4, 2])   # 허공에 떠 있는 막대기! (대상 벡터)

print(f"기준 벡터 a(방바닥): {a}")
print(f"대상 벡터 b(막대기): {b}")

# ================================
# 1단계: b와 a의 내적 구하기 (분자)
# 앞서 배운 대로 같은 위치끼리 곱해서 전부 더함
# (3*1) + (1*2) + (4*0) + (2*-1) = 3 + 2 + 0 - 2 = 3
num = b.dot_product(a)  

# 2단계: a 자기 자신의 내적 구하기 (분모)
# (1*1) + (2*2) + (0*0) + (-1*-1) = 1 + 4 + 0 + 1  = 6
den = a.dot_product(a)  

# 3단계: 그림자의 비율(투영 계수) 스칼라 구하기
# 막대기 그림자가 방바닥 총길이의 얼만큼을 차지하나?
proj_coeff = num / den  # 3 나누기 6은 0.5 (즉, 절반길이 1/2)

# 4단계: 진짜 그림자 벡터 완성하기!
# 투영 계수(1/2)를 기준 벡터 a 전체에 스칼라 곱(크기만 늘리거나 줄임) 해줌.
proj_b_on_a = proj_coeff * a

print(f"투영 계수 (그림자의 비율): {proj_coeff}")
print(f"최종 정사영 벡터 (바닥에 맺힌 그림자): {proj_b_on_a}")
# ================================

💡 최종 계산 결과 해설

  • 그림자 비율(투영계수)은 방바닥 a 길이의 딱 1/2 로 나옴.
  • 원래의 방바닥 벡터 a[1, 2, 0, -1] 였음.
  • 이 배열 칸칸마다 그림자 비율 1/2을 곱해주면?
  • [1/2, 1, 0, -1/2] 이라는 최종 4차원 그림자 벡터(정사영 결과물)가 뿅 하고 탄생함!

🎯 오늘의 요약 (Summary)

  • 스칼라 vs 벡터: 숫자로만 이루어진 단순한 크기 정보는 스칼라(예: 70kg). 크기에 방향(화살표)까지 포함해서 여러 개로 묶어둔 덩어리는 벡터임.
  • 내적 (Dot Product): 두 화살표가 가리키는 방향이 얼마나 닮았는지(유사도)를 계산해서 숫자 1개로 압축해 주는 수학적 체계임.
  • 정사영 (Projection): 삐딱하게 떠있는 내 데이터에 빛을 쏴서, 내가 원하는 기준선(바닥)에 맺히는 그림자를 구하는 과정임.
  • 수학과 컴퓨터의 만남: 고차원의 복잡한 수학도 파이썬과 SageMath 같은 도구를 쓰면, 곱하기와 덧셈의 원리로 순식간에 답을 대신 구해줌.

Comments