Ch.1 Introduction to Vectors — 선형결합, 내적, 코사인

Strang §1.1–1.2: 벡터 덧셈·스칼라 곱·선형결합·내적·길이·각도

Gilbert Strang의 Introduction to Linear Algebra Ch.1을 다룬다. 벡터의 두 핵심 연산(덧셈, 스칼라 곱)과 선형결합 cv+dw의 기하학적 구조를 소개하고, 내적(dot product), 벡터의 길이(노름), 코사인 공식을 유도한다.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 06일

1 선형대수학의 전체 지도

이 포스트는 Strang의 Introduction to Linear Algebra Ch.1에서 출발하여 선형대수학 전체 시리즈의 입구 역할을 한다. 아래는 앞으로 배울 내용의 로드맵이다. 각 장(chapter)이 이전 장 위에 쌓이는 구조이므로, 순서를 건너뛰지 않는 것이 중요하다.

핵심 질문 이 포스트와의 연결
Ch.1 벡터 벡터를 어떻게 더하고, 곱하고, 조합하는가? 이 포스트에서 다룬다
Ch.2 연립방정식 \(Ax = b\) 를 어떻게 체계적으로 푸는가? 선형결합 \(c\mathbf{v} + d\mathbf{w}\)\(Ax\) 의 정체이다
Ch.3 벡터 공간 선형결합이 만드는 공간은 어떤 구조인가? 선형결합의 집합 → 열 공간, 영 공간
Ch.4 직교성 벡터들이 수직이면 무엇이 좋은가? 내적 \(= 0\) 이 수직의 판별 기준이다
Ch.5 행렬식 행렬이 가역인지 어떻게 아는가? 행렬식 \(\neq 0\) 이면 선형결합으로 모든 \(b\) 에 도달
Ch.6 고윳값 행렬이 벡터의 방향을 보존하는 경우는? 고유벡터: \(A\mathbf{x} = \lambda\mathbf{x}\) — 스칼라 곱과 같은 효과
Ch.7 양정치·SVD 행렬의 “건강 상태”를 어떻게 판별하는가? 내적 기반 이차형식 \(\mathbf{x}^T A\mathbf{x}\) 의 부호

이 포스트에서 정의하는 세 가지 — 선형결합, 내적, 노름 — 이 이후 모든 장의 기초가 된다.


2 왜 벡터에서 시작하는가

선형대수학의 출발점은 단순하다. 두 가지 연산—벡터 덧셈스칼라 곱—만 정의하면, 그 위에 행렬·부분공간·고유값·SVD까지 모든 것이 쌓인다.

Strang이 강조하는 핵심 메시지는 이것이다:

“선형대수학의 심장은 두 연산에 있다 — \(\mathbf{v} + \mathbf{w}\)\(c\mathbf{v}\), 그리고 이를 결합한 선형결합 \(c\mathbf{v} + d\mathbf{w}\).” (Strang, 2009, Ch.1)

2차원·3차원에서 시작하지만, 이 직관은 \(n\) 차원 공간에서도 완벽하게 유지된다. 10차원 벡터를 그릴 수는 없지만, 연산 규칙은 2차원과 완전히 동일하다.


3 벡터의 기본 연산

3.1 벡터 덧셈 (Vector Addition)

정의: 벡터 덧셈

\(n\) 차원 벡터 \(\mathbf{v} = (v_1, v_2, \ldots, v_n)\)\(\mathbf{w} = (w_1, w_2, \ldots, w_n)\) 의 합은 성분별(component-wise) 덧셈으로 정의한다.

\[\mathbf{v} + \mathbf{w} = \begin{bmatrix} v_1 + w_1 \\ v_2 + w_2 \\ \vdots \\ v_n + w_n \end{bmatrix}\]

기하학적으로는 평행사변형의 대각선이다. \(\mathbf{v}\) 의 끝점에서 \(\mathbf{w}\) 를 이으면 합벡터 \(\mathbf{v} + \mathbf{w}\) 가 된다.

예시:

\[\mathbf{v} = \begin{bmatrix} 4 \\ 2 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} -1 \\ 2 \end{bmatrix} \implies \mathbf{v} + \mathbf{w} = \begin{bmatrix} 3 \\ 4 \end{bmatrix}\]

덧셈의 교환 법칙 \(\mathbf{v} + \mathbf{w} = \mathbf{w} + \mathbf{v}\) 는 성분끼리 비교하면 자명하다. 평행사변형에서는 “어느 방향으로 먼저 가도 같은 꼭짓점에 도달한다”는 의미이다.

3.2 스칼라 곱 (Scalar Multiplication)

정의: 스칼라 곱

실수 \(c\) 와 벡터 \(\mathbf{v}\) 의 곱은 각 성분에 \(c\) 를 곱한다.

\[c\mathbf{v} = \begin{bmatrix} cv_1 \\ cv_2 \\ \vdots \\ cv_n \end{bmatrix}\]

\(c > 1\) 이면 길어지고, \(0 < c < 1\) 이면 짧아지고, \(c < 0\) 이면 방향이 뒤집힌다. \(c = 0\) 이면 영벡터 \(\mathbf{0}\) 이 된다. 영벡터 \(\mathbf{0}\) 은 숫자 \(0\) 과 다르다 — 성분이 모두 0인 벡터이다.


4 선형결합 (Linear Combination)

정의: 선형결합

벡터 \(\mathbf{v}\)\(\mathbf{w}\)선형결합(linear combination)은 스칼라 \(c, d\) 를 이용한 다음 표현이다.

\[c\mathbf{v} + d\mathbf{w}\]

\(c\)\(d\) 가 모든 실수를 취할 때, 이 결합이 만드는 집합이 중요하다.

두 가지 기본 연산을 하나로 묶은 것이 선형결합이다. 특수한 경우들을 나열하면:

\(c\) \(d\) 결과
1 1 \(\mathbf{v} + \mathbf{w}\) (합)
1 \(-1\) \(\mathbf{v} - \mathbf{w}\) (차)
0 0 \(\mathbf{0}\) (영벡터)
\(c\) 0 \(c\mathbf{v}\) (\(\mathbf{v}\) 방향 스케일링)

4.1 선형결합이 만드는 기하학적 구조

\(n\) 차원 공간에서 벡터들의 선형결합이 만드는 집합이 어떤 모양인지가 선형대수학의 핵심 질문이다.

핵심 사실: 선형결합의 기하학적 구조 (전형적인 경우)

3차원 공간에서 벡터들의 선형결합 \(c_1\mathbf{u} + c_2\mathbf{v} + c_3\mathbf{w}\) 가 만드는 집합:

  1. 벡터 1개 \(\{c\mathbf{u}\}\)직선 (원점을 지나는 선)
  2. 벡터 2개 \(\{c\mathbf{u} + d\mathbf{v}\}\)평면 (원점을 지나는 2차원 평면)
  3. 벡터 3개 \(\{c\mathbf{u} + d\mathbf{v} + e\mathbf{w}\}\)3차원 전체 공간 \(\mathbb{R}^3\) (전형적인 경우)

“전형적인 경우”라는 단서가 중요하다. 세 번째 벡터 \(\mathbf{w}\) 가 이미 \(\mathbf{u}\)\(\mathbf{v}\) 의 선형결합이라면, 3개 벡터로도 평면을 벗어나지 못한다. 이것이 나중에 배울 선형 독립(linear independence)기저(basis) 개념의 씨앗이다.

왜 중요한가: 선형결합은 선형대수학 전체를 관통한다.

  • Ch.2: \(Ax\)\(A\) 의 열들의 선형결합이다. “\(Ax = b\) 가 해를 가지는가?”는 “\(b\) 가 열들의 선형결합으로 표현 가능한가?”와 같은 질문이다
  • Ch.3: 선형결합이 만드는 집합이 열 공간(Column Space) \(C(A)\) 이다. 열 공간의 차원이 랭크(rank)이다
  • Ch.4: 데이터 \(b\) 가 열 공간 밖에 있으면 정확한 해가 없다. 이때 \(b\) 를 열 공간 위로 정사영(projection)하여 최적 근사해를 구한다 — 이것이 최소제곱법이다
  • Ch.7: \(n\) 개 데이터 포인트를 \(p\) 개 벡터의 선형결합으로 표현할 수 있는지가 차원 축소(PCA, SVD)의 핵심 질문이다

5 내적 (Dot Product)

정의: 내적 (Dot Product)

\(n\) 차원 벡터 \(\mathbf{v} = (v_1, \ldots, v_n)\)\(\mathbf{w} = (w_1, \ldots, w_n)\) 의 내적은:

\[\mathbf{v} \cdot \mathbf{w} = v_1 w_1 + v_2 w_2 + \cdots + v_n w_n = \sum_{i=1}^{n} v_i w_i\]

두 벡터를 “곱해서 더하면” 하나의 스칼라가 나온다.

내적은 교환 법칙이 성립한다: \(\mathbf{v} \cdot \mathbf{w} = \mathbf{w} \cdot \mathbf{v}\).

5.1 내적의 직관: 수직성과 각도의 측정

수직 벡터의 내적은 0이다.

\[\mathbf{v} = \begin{bmatrix} 4 \\ 2 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} -1 \\ 2 \end{bmatrix} \implies \mathbf{v} \cdot \mathbf{w} = (4)(-1) + (2)(2) = 0\]

왜 수직이면 내적이 0인가? 피타고라스 정리에서 유도된다. \(\mathbf{v}\)\(\mathbf{w}\) 가 수직이면 \(\|\mathbf{v}\|^2 + \|\mathbf{w}\|^2 = \|\mathbf{v} - \mathbf{w}\|^2\) 이다. 오른쪽을 전개하면 \(-2\mathbf{v} \cdot \mathbf{w}\) 항이 남고, 이를 0으로 만드는 조건이 \(\mathbf{v} \cdot \mathbf{w} = 0\) 이다 (Strang, 2009, §1.2).

내적의 부호는 두 벡터가 이루는 각도를 즉시 알려준다:

  • \(\mathbf{v} \cdot \mathbf{w} > 0\) : 두 벡터의 각도 $< 90° $ (같은 방향에 가깝다)
  • \(\mathbf{v} \cdot \mathbf{w} = 0\) : $= 90° $ (수직, 직교)
  • \(\mathbf{v} \cdot \mathbf{w} < 0\) : $> 90° $ (반대 방향에 가깝다)

내적 \(= 0\) 이라는 조건은 Ch.4 직교성(Orthogonality)의 출발점이다. 행공간과 영공간이 직교한다는 사실, 투영 행렬, 그람-슈미트 과정, QR 분해 — 이 모든 것이 “내적이 0이면 수직”이라는 이 단순한 판별 기준에서 시작한다.


6 벡터의 길이와 단위벡터

6.1 길이 (노름, Norm)

정의: 벡터의 길이 (L2 노름)

벡터 \(\mathbf{v}\) 의 길이(노름)는 자기 자신과의 내적의 제곱근이다.

\[\|\mathbf{v}\| = \sqrt{\mathbf{v} \cdot \mathbf{v}} = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2}\]

2차원에서는 피타고라스 정리의 빗변이다. 3차원으로 확장하면 직육면체의 대각선이고, \(n\) 차원에서도 동일한 공식이 성립한다.

예시: \[\mathbf{v} = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} \implies \|\mathbf{v}\|^2 = 1 + 4 + 9 = 14 \implies \|\mathbf{v}\| = \sqrt{14}\]

\(n\) 차원 단위 큐브의 대각선 벡터 \((1, 1, \ldots, 1)\) 의 길이는 \(\sqrt{n}\) 이다. 차원이 커질수록 대각선이 길어진다는 것이 고차원의 직관이다.

6.2 단위벡터 (Unit Vector)

정의: 단위벡터

길이가 1인 벡터를 단위벡터(unit vector)라 한다. \(\mathbf{u} \cdot \mathbf{u} = 1\).

임의의 비영 벡터 \(\mathbf{v}\) 에서 단위벡터를 만들려면 길이로 나눈다:

\[\mathbf{u} = \frac{\mathbf{v}}{\|\mathbf{v}\|}\]

표준 기저벡터 \(\mathbf{i} = (1, 0)\), \(\mathbf{j} = (0, 1)\) 이 대표적인 단위벡터이다. 2차원에서 각도 \(\theta\) 방향의 단위벡터는 \((\cos\theta, \sin\theta)\) 이며, 단위원 위의 점에 해당한다.

왜 단위벡터가 중요한가: 방향만 남기고 크기를 제거한다. 코사인 유사도(cosine similarity)는 두 벡터를 단위벡터로 정규화한 뒤 내적을 구하는 것이다. 텍스트 문서의 방향(주제)을 비교할 때 길이(문서 길이)에 영향받지 않도록 하는 핵심 아이디어이다.


7 코사인 공식과 슈바르츠 부등식

코사인 공식 (Cosine Formula)

비영 벡터 \(\mathbf{v}\)\(\mathbf{w}\) 사이의 각도 \(\theta\) 는 다음으로 구한다.

\[\cos\theta = \frac{\mathbf{v} \cdot \mathbf{w}}{\|\mathbf{v}\| \|\mathbf{w}\|}\]

이를 슈바르츠 부등식(Schwarz Inequality)으로 이해하면: \(|\mathbf{v} \cdot \mathbf{w}| \leq \|\mathbf{v}\| \|\mathbf{w}\|\).

코사인은 \(-1\)\(1\) 사이에 있으므로, 이 부등식이 성립해야 코사인 공식이 의미를 갖는다.

코사인 공식의 유도: 먼저 단위벡터 \(\mathbf{u} = \mathbf{v}/\|\mathbf{v}\|\), \(\mathbf{U} = \mathbf{w}/\|\mathbf{w}\|\) 를 구한다. 단위벡터끼리의 내적이 \(\cos\theta\) 임을 2차원 삼각함수 회전 변환으로 증명할 수 있다. 일반 벡터로 확장하면 위 공식이 된다 (Strang, 2009, §1.2).

슈바르츠 부등식이 말하는 것: “두 벡터의 내적은 길이의 곱보다 클 수 없다.” 등호는 \(\mathbf{v}\)\(\mathbf{w}\) 가 평행할 때(\(\theta = 0\) 또는 $= 180° $)만 성립한다.

삼각 부등식: 슈바르츠 부등식의 결과로 \(\|\mathbf{v} + \mathbf{w}\| \leq \|\mathbf{v}\| + \|\mathbf{w}\|\) 가 따라온다. “두 변의 합은 나머지 한 변보다 크다”는 삼각형의 성질이다.


8 ML/DL에서의 응용

분야 활용 선형대수 개념
추천 시스템 사용자-아이템 유사도 측정 \(\mathbf{u} \cdot \mathbf{v}\) (내적)
자연어 처리 단어/문서 유사도 \(\cos\theta = \mathbf{v} \cdot \mathbf{w} / (\|\mathbf{v}\|\|\mathbf{w}\|)\)
Attention 메커니즘 Query-Key 관련도 \(\text{score} = \mathbf{q} \cdot \mathbf{k}\)
차원 축소 (PCA) 분산이 최대인 방향 탐색 단위벡터 + 선형결합
신경망 레이어 가중합 = 입력의 선형결합 \(c_1\mathbf{x}_1 + \cdots + c_n\mathbf{x}_n\)

9 코드 예시

9.1 Step 1: Low-level 구현 (원리 이해)

import math

def dot_product(v: list, w: list) -> float:
    """내적 = 대응 성분끼리 곱한 뒤 합산"""
    assert len(v) == len(w), "차원이 같아야 한다"
    return sum(vi * wi for vi, wi in zip(v, w))

def norm(v: list) -> float:
    """L2 노름 = 각 성분 제곱합의 제곱근"""
    return math.sqrt(dot_product(v, v))

def cosine_similarity(v: list, w: list) -> float:
    """코사인 유사도 = 내적 / (||v|| * ||w||)"""
    return dot_product(v, w) / (norm(v) * norm(w))

def unit_vector(v: list) -> list:
    """단위벡터 = v / ||v||"""
    n = norm(v)
    return [vi / n for vi in v]

# 예시
v = [4, 2]
w = [-1, 2]
print(f"내적: {dot_product(v, w)}")           # 0 → 수직
print(f"||v||: {norm([1, 2, 3]):.4f}")         # sqrt(14) ≈ 3.7417

v = [3, 1]
w = [1, 3]
angle_rad = math.acos(cosine_similarity(v, w))
print(f"각도: {math.degrees(angle_rad):.1f}°") # 예상: 약 53.1°

# 선형결합 예시
c, d = 2, -1
u = [1, 0, 3]
v = [1, 2, 1]
linear_comb = [c * u[i] + d * v[i] for i in range(3)]
print(f"2u - v = {linear_comb}")              # [1, -2, 5]

9.2 Step 2: NumPy 구현 (실무 활용)

import numpy as np
import matplotlib.pyplot as plt

v = np.array([4, 2])
w = np.array([-1, 2])

# 내적
dot = np.dot(v, w)                           # 0 (수직)
dot_alt = v @ w                              # 동일 결과 (@ 연산자)

# 노름
norm_v = np.linalg.norm(np.array([1, 2, 3]))  # sqrt(14)

# 코사인 유사도
v = np.array([3, 1])
w = np.array([1, 3])
cos_theta = np.dot(v, w) / (np.linalg.norm(v) * np.linalg.norm(w))
angle = np.degrees(np.arccos(cos_theta))
print(f"각도: {angle:.1f}°")

# 단위벡터
v = np.array([1, 1])
u = v / np.linalg.norm(v)                    # [1/sqrt(2), 1/sqrt(2)]

# 선형결합: 모든 가능한 cv + dw를 시각화
v = np.array([1, 0])
w = np.array([0, 1])
fig, ax = plt.subplots(figsize=(5, 5))

for c in np.linspace(-2, 2, 5):
    for d in np.linspace(-2, 2, 5):
        point = c * v + d * w
        ax.scatter(*point, color='blue', s=30)

ax.axhline(0, color='gray', linewidth=0.5)
ax.axvline(0, color='gray', linewidth=0.5)
ax.set_title(r"$c\mathbf{v} + d\mathbf{w}$ 의 격자 구조")
ax.set_aspect('equal')
plt.tight_layout()
plt.show()

10 노름 종류 비교 (Norm Types)

벡터의 크기를 측정하는 방법은 여러 가지가 있다. 머신러닝에서는 용도에 따라 다른 노름을 사용한다.

이름 기호 수식 특징
L1 노름 (맨하탄) \(\|\mathbf{x}\|_1\) \(\sum_i \|x_i\|\) 희소성(sparsity) 유도, 이상치에 강건
L2 노름 (유클리드) \(\|\mathbf{x}\|_2\) \(\sqrt{\sum_i x_i^2}\) 가장 일반적, 최소제곱법의 기반
p-노름 \(\|\mathbf{x}\|_p\) \(\left(\sum_i \|x_i\|^p\right)^{1/p}\) L1, L2의 일반화
최대 노름 \(\|\mathbf{x}\|_\infty\) \(\max_i \|x_i\|\) 가장 큰 성분의 절댓값
프로베니우스 노름 \(\|\mathbf{A}\|_F\) \(\sqrt{\sum_{i,j} a_{ij}^2}\) 행렬 버전의 L2 노름
import numpy as np

x = np.array([1, -2, 3])

# 다양한 노름 계산
l1  = np.linalg.norm(x, ord=1)        # 맨하탄: |1|+|-2|+|3| = 6
l2  = np.linalg.norm(x)               # 유클리드: sqrt(14) ≈ 3.742
linf = np.linalg.norm(x, ord=np.inf)  # 최대: max(1,2,3) = 3

print(f"L1 노름: {l1}")   # 6.0
print(f"L2 노름: {l2:.3f}")  # 3.742
print(f"L∞ 노름: {linf}")    # 3.0

# 두 벡터 사이의 거리
v = np.array([1, 2, 3])
w = np.array([4, 5, 6])

euclidean_dist = np.linalg.norm(v - w)         # 유클리드 거리 ≈ 5.196
manhattan_dist = np.sum(np.abs(v - w))          # 맨하탄 거리 = 9
print(f"유클리드 거리: {euclidean_dist:.3f}")
print(f"맨하탄 거리: {manhattan_dist}")

# 프로베니우스 노름 (행렬)
A = np.array([[1, 2], [3, 4]])
fro = np.linalg.norm(A, 'fro')   # sqrt(1+4+9+16) = sqrt(30) ≈ 5.477
print(f"프로베니우스 노름: {fro:.3f}")

11 관련 주제

선행 지식

  • 없음 (이 포스트가 선형대수의 출발점이다)

Ch.1~2: 벡터와 연립방정식

Ch.3: 벡터 공간 — 선형결합이 만드는 구조

Ch.4: 직교성 — 내적 \(= 0\) 에서 출발

Ch.6~7: 고윳값과 양정치 — 스칼라 곱의 확장

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: