Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

선형대수

기계학습이 다루는 데이터는 대부분 숫자의 모음, 즉 텐서(tensor) 로 표현됩니다. 선형대수는 이런 벡터와 행렬을 다루는 수학으로, 기계학습 알고리즘의 연산을 표현하는 언어입니다. 여기서는 기계학습에 필요한 최소한의 선형대수 개념을 살펴봅니다. (텐서를 코드로 다루는 방법은 numpy 장에서 실습합니다.)

1벡터와 행렬

단일한 값은 스칼라, 숫자를 일렬로 나열한 1차원 텐서는 벡터, 2차원으로 배열한 것은 행렬입니다. 3차원 이상은 3차원 텐서·4차원 텐서처럼 부릅니다.

기계학습에서 하나의 표본은 보통 특성들을 모은 특징 벡터로 표현되고, 여러 표본을 쌓으면 행렬(디자인 행렬)이 됩니다. 넘파이에서는 이 모두를 ndarray로 표현합니다.

import numpy as np

스칼라 = 3.0
벡터 = np.array([1, 2, 3])
행렬 = np.array([[1, 2, 3],
              [4, 5, 6]])
print('벡터 형상:', 벡터.shape, '/ 행렬 형상:', 행렬.shape)
벡터 형상: (3,) / 행렬 형상: (2, 3)

2내적

두 벡터의 내적(inner product) 은 같은 위치의 원소를 곱해 모두 더한 값입니다.

ab=iaibi\mathbf{a} \cdot \mathbf{b} = \sum_i a_i b_i

내적은 두 벡터가 얼마나 같은 방향을 향하는지를 나타내어, 유사도나 투영을 계산하는 데 쓰입니다. 넘파이에서 *는 원소별 곱이므로, 내적은 np.dot(또는 @)으로 계산합니다.

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print('원소별 곱:', a * b)        # [4, 10, 18]
print('내적:', np.dot(a, b))      # 4 + 10 + 18 = 32
원소별 곱: [ 4 10 18]
내적: 32

3행렬 곱

행렬 곱은 선형 변환을 표현합니다. 디자인 행렬 XX(행=표본, 열=특성)에 가중치 벡터 w\mathbf{w} 를 곱하면, 각 표본에 대한 선형 결합을 한 번에 얻습니다.

y^=Xw\hat{\mathbf{y}} = X\mathbf{w}

이것이 바로 선형 모델의 예측입니다. 선형 모델·신경망·주성분 분석 등 많은 알고리즘의 핵심 연산이 행렬 곱으로 표현되며, 넘파이에서는 @ 연산자로 계산합니다.

X = np.array([[1.0, 2.0],     # 표본 3개, 특성 2개
              [3.0, 4.0],
              [5.0, 6.0]])
w = np.array([0.5, -1.0])     # 특성별 가중치
print('예측 Xw:', X @ w)       # 각 표본의 선형 결합
예측 Xw: [-1.5 -2.5 -3.5]

정리하면, 데이터는 벡터·행렬로 표현되고, 내적과 행렬 곱은 기계학습 연산의 기본 단위입니다. 이런 선형대수 연산을 효율적으로 수행하는 도구가 넘파이입니다.