Skip to main content

선형대수 핵심

선형대수(Linear Algebra)는 벡터와 행렬을 다루는 수학 분야로, ML 알고리즘의 데이터 표현과 변환의 기반이 됩니다.

학습 목표

  • 벡터와 행렬의 기본 연산을 이해합니다.
  • 내적(dot product)의 기하학적 의미를 파악합니다.
  • 고유값 분해(eigendecomposition)가 PCA에서 어떻게 활용되는지 이해합니다.
  • ML에서 선형대수가 사용되는 대표적인 사례를 파악합니다.

왜 중요한가

ML에서 데이터는 행렬로, 개별 데이터 포인트는 벡터로 표현됩니다. 모델 학습은 본질적으로 행렬 연산이며, PCA, SVM, 추천 시스템 등 핵심 알고리즘은 선형대수 없이는 이해할 수 없습니다.

핵심 개념

벡터 (Vector)

벡터는 크기와 방향을 가진 양으로, ML에서는 하나의 데이터 포인트를 나타냅니다.
import numpy as np

# 3차원 벡터: 키(cm), 몸무게(kg), 나이(세)
person = np.array([175, 70, 30])

# 벡터 연산
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(f"덧셈: {a + b}")           # [5, 7, 9]
print(f"스칼라 곱: {2 * a}")       # [2, 4, 6]
print(f"크기(노름): {np.linalg.norm(a):.2f}")  # 3.74
벡터의 크기(노름, Norm): 벡터의 길이를 나타냅니다.
  • L1 노름: 각 원소의 절대값 합 → 정규화(Lasso)에서 사용
  • L2 노름: 각 원소의 제곱합의 제곱근 → 정규화(Ridge)에서 사용
v = np.array([3, 4])
print(f"L1 노름: {np.linalg.norm(v, ord=1)}")  # 7.0
print(f"L2 노름: {np.linalg.norm(v, ord=2)}")  # 5.0

내적 (Dot Product)

두 벡터의 내적은 벡터 간의 유사도를 측정하는 핵심 연산입니다.
a = np.array([1, 0])
b = np.array([0, 1])
c = np.array([1, 1])

# 내적 계산
print(f"직교 벡터 내적: {np.dot(a, b)}")    # 0 (직교 = 유사도 없음)
print(f"같은 방향 내적: {np.dot(a, c)}")     # 1 (유사함)

# 코사인 유사도: 방향만 비교 (크기 무시)
cos_sim = np.dot(a, c) / (np.linalg.norm(a) * np.linalg.norm(c))
print(f"코사인 유사도: {cos_sim:.4f}")       # 0.7071
ML 활용: 코사인 유사도는 문서 유사도 측정, 추천 시스템, KNN 알고리즘에서 핵심적으로 사용됩니다.

행렬 (Matrix)

행렬은 벡터의 모음으로, ML에서는 전체 데이터셋을 나타냅니다.
# 3명의 학생 데이터 (3x2 행렬)
# 행: 샘플, 열: 특성
X = np.array([
    [175, 70],   # 학생 1: 키, 몸무게
    [160, 55],   # 학생 2
    [180, 85],   # 학생 3
])

print(f"행렬 형태: {X.shape}")  # (3, 2) → 3개 샘플, 2개 특성

# 행렬 곱 (선형 변환)
W = np.array([[0.5], [0.3]])  # 가중치 벡터
y = X @ W  # 행렬 곱
print(f"선형 변환 결과:\n{y}")

고유값과 고유벡터 (Eigenvalues & Eigenvectors)

직관: 행렬을 통한 변환에서 방향이 변하지 않는 벡터가 고유벡터이고, 그 벡터가 늘어나거나 줄어드는 비율이 고유값입니다.
# 2x2 공분산 행렬
C = np.array([[4, 2],
              [2, 3]])

# 고유값 분해
eigenvalues, eigenvectors = np.linalg.eig(C)
print(f"고유값: {eigenvalues}")        # 데이터 분산의 크기
print(f"고유벡터:\n{eigenvectors}")    # 데이터의 주요 방향
PCA와의 연결: PCA는 공분산 행렬의 고유벡터를 주성분으로, 고유값을 설명되는 분산으로 사용합니다. 가장 큰 고유값에 해당하는 고유벡터가 데이터의 가장 중요한 방향입니다.
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

# PCA가 내부적으로 고유값 분해를 수행
X = load_iris().data
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

# 주성분 = 고유벡터
print(f"주성분(고유벡터):\n{pca.components_}")

# 설명된 분산 비율 = 정규화된 고유값
print(f"설명 분산 비율: {pca.explained_variance_ratio_}")

행렬 분해 (Matrix Decomposition)

복잡한 행렬을 단순한 행렬들의 곱으로 분해하는 기법입니다.
분해 방법수식ML 활용
고유값 분해A = PDP^(-1)PCA, 스펙트럼 군집화
특이값 분해(SVD)A = USV^TLSA, 추천 시스템
NMFA = WH (비음수)토픽 모델링, 이미지 분해

AI/ML에서의 활용

알고리즘사용되는 선형대수 개념레퍼런스
PCA공분산 행렬, 고유값 분해PCA
SVM내적, 초평면, 커널 트릭SVM
선형 회귀행렬 곱, 역행렬 (정규방정식)선형 회귀
추천 시스템행렬 분해 (SVD)Truncated SVD
KNN거리 계산 (노름)KNN
네, scikit-learn은 내부적으로 선형대수 연산을 처리합니다. 그러나 PCA의 주성분을 해석하거나 SVM의 커널을 이해하려면 기본적인 선형대수 지식이 필요합니다.
NumPy는 파이썬에서 선형대수 연산을 효율적으로 수행하는 라이브러리입니다. np.dot, np.linalg.eig, np.linalg.svd 등이 핵심 함수입니다.

체크리스트

  • 벡터의 내적과 코사인 유사도를 계산할 수 있다
  • L1, L2 노름의 차이를 설명할 수 있다
  • 고유값과 고유벡터의 직관적 의미를 설명할 수 있다
  • PCA가 고유값 분해를 어떻게 활용하는지 설명할 수 있다

다음 문서