[인공지능 수학] 벡터와 스칼라의 이해 및 SageMath를 활용한 내적/정사영 실습
📌 오늘의 학습 목표
- 벡터(Vector) 와 스칼라(Scalar) 의 개념적 차이를 이해함.
- 파이썬 기반의 오픈소스 수학 소프트웨어인 SageMath를 활용하여,
- 3차원 공간에서 두 벡터의 내적(Dot Product) 을 계산함.
- 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차원)에서는 [x축, y축]의 형태로
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}")
💡 계산 과정 쪼그라보기 (컴퓨터가 한 일)
- 첫 번째 칸(x)끼리 곱함:
2 * 4= 8 - 두 번째 칸(y)끼리 곱함:
-1 * 5= -5 - 세 번째 칸(z)끼리 곱함:
3 * -2= -6 - 이 세 개를 모두 더함:
8 + (-5) + (-6)= -3- 두 벡터의 방향 씽크로율(유사도)을 나타내는 단 하나의 스칼라 숫자는 -3으로 계산됨!
3. 벡터의 정사영 (Projection) 실습
정사영(Projection)은 한자 그대로 ‘바르게(直) 비추는 그림자(影)’라는 뜻임. 천장에 아주 밝고 평평한 조명이 켜져 있다고 상상해봄. 대각선으로 기울어진 막대기(벡터 b)가 있을 때, 그 막대기의 그림자가 방바닥(기준이 되는 벡터 a)에 일직선으로 쭉 떨어져서 맺히게 됨. 이 바닥에 맺힌 그림자 막대기를 구하는 과정이 정사영임.
정사영을 왜 쓸까? 어떤 복잡한 데이터(허공에 떠있는 막대기)에서 내가 관심 있는 특정 측면(방바닥)의 정보만 쪽 빼내고 싶을 때 사용함.
정사영 계산 공식 (단 3단계):
- 내 데이터(벡터 b)와 관심 있는 바닥(벡터 a)이 얼마나 비슷한지 내적을 구함 (분자).
- 바닥(벡터 a) 자기 자신의 길이(크기)를 내적을 통해 구함 (분모).
- 위에서 나눈 비율(그림자가 바닥의 몇 배 크기인지)을 다시 바닥(벡터 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