
머신러닝
Linear Algebra for MLML을 위한 선형대수
선형대수는 머신러닝의 핵심 수학 기반이다. 데이터를 행렬로 표현하고, 신경망 연산을 행렬곱으로 구현하며, PCA·SVD 등 차원 축소를 이해하는 데 필수적이다.
ML에서의 핵심 연산
선형 변환: y = Wx + b
W: 가중치 행렬 (d_out × d_in)
x: 입력 벡터 (d_in × 1)
b: 편향 벡터 (d_out × 1)
배치 처리: Y = XW^T + b
X: 데이터 행렬 (batch × d_in)
W: 가중치 행렬 (d_out × d_in)
Y: 출력 행렬 (batch × d_out)NumPy로 구현
python
import numpy as np
# 행렬 연산
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
B = np.random.randn(3, 4)
# 행렬곱
C = A @ B # 또는 np.matmul(A, B)
# 전치 행렬
A_T = A.T
# 역행렬 (역행렬 가능한 경우)
A_inv = np.linalg.inv(A[:2,:2])
# 고유값 분해
eigenvalues, eigenvectors = np.linalg.eig(A[:2,:2])
# 특잇값 분해 (SVD)
U, sigma, Vt = np.linalg.svd(A, full_matrices=False)
print(f"A = U·Σ·V^T: 복원 오차 = {np.linalg.norm(U @ np.diag(sigma) @ Vt - A):.2e}")PCA (주성분 분석)
python
from sklearn.decomposition import PCA
import numpy as np
# 1000개 샘플, 50차원 데이터
X = np.random.randn(1000, 50)
# SVD 기반 PCA
pca = PCA(n_components=10)
X_reduced = pca.fit_transform(X)
print(f"원래 차원: {X.shape}") # (1000, 50)
print(f"축소 차원: {X_reduced.shape}") # (1000, 10)
print(f"설명 분산 비율: {pca.explained_variance_ratio_[:5]}")
# 직접 구현 (중앙화 → 공분산 → 고유값)
X_centered = X - X.mean(axis=0)
cov_matrix = X_centered.T @ X_centered / (len(X) - 1)
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 내림차순 정렬
idx = eigenvalues.argsort()[::-1]
top_k_eigenvectors = eigenvectors[:, idx[:10]]
X_pca = X_centered @ top_k_eigenvectors코사인 유사도
python
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 벡터 배치 코사인 유사도 (임베딩 검색)
def batch_cosine_similarity(queries, corpus):
queries_norm = queries / np.linalg.norm(queries, axis=1, keepdims=True)
corpus_norm = corpus / np.linalg.norm(corpus, axis=1, keepdims=True)
return queries_norm @ corpus_norm.T