1. 선형대수
머신러닝 모델은 데이터를 숫자로 표현하는데 보통 벡터(vector) 와 행렬(matrix) 로 표현할때 선형대수를 사용
✅ 개념
- 스칼라 - 0차원 텐서 ([2], [3])
- 벡터 - 1차원 텐서 ([2,3])
- 행렬(매트릭스) - 2차원 텐서 ([[2,3],[4,5]])
- 텐서 - n차원 배열로 구성된 데이터
- 노름(norm) - 벡터나 행렬의 크기를 측정하는 방법
📌 norm
대표적으로 L1노름, L2노름, 무한 노름이 있으며 L1노름은 벡터의 각 원소의 절댓값을 모두 더한 값으로 희소성을 강조하는 데 사용돼서 Lasso 회귀 같은 모델에서 많이 활용됨
import numpy as np
x = np.array([3, -4, 2])
L1_norm = np.linalg.norm(x, ord=1) # L1 노름 계산
print("L1 노름:", L1_norm) # 9
L2노름은 벡터의 각 원소를 제곱한 후 더한 뒤, 제곱근을 취한 값으로 거리 측정, 정규화 (Ridge 회귀, 신경망 가중치 규제 등) 에서 많이 사용
L2_norm = np.linalg.norm(x, ord=2) # L2 노름 계산
print("L2 노름:", L2_norm) # 5.385164807134504
무한노름은 벡터의 원소 중 절댓값이 가장 큰 값으로 최대 오차를 최소화하는 문제 에서 사용됨
L_inf_norm = np.linalg.norm(x, ord=np.inf)
print("무한 노름:", L_inf_norm) # 4
Pytorch 사용
import torch
# 벡터 정의
x = torch.tensor([3.0, -4.0, 2.0])
# L1 노름 (맨해튼 거리)
L1_norm = torch.norm(x, p=1)
print("L1 노름:", L1_norm.item()) # 9.0
# L2 노름 (유클리드 거리)
L2_norm = torch.norm(x, p=2)
print("L2 노름:", L2_norm.item()) # 5.385164737701416
# 무한 노름 (최댓값 노름)
L_inf_norm = torch.norm(x, p=float('inf'))
print("무한 노름:", L_inf_norm.item()) # 4.0
2. 벡터 연산
✅ 벡터 내적
두 벡터의 곱의 합을 구하는 연산으로 다음과 같이 활용된다.
- 유사도 측정 : 머신러닝에서 유사도를 측정하여 분류, 추천등에 활용
- 선형 회귀 : 알려진 다른 관련 데이터 값을 사용하여 알 수 없는 데이터의 값을 예측하는 데이터 분석 기법
- 손실 함수와 경사 하강법 : 예측 오류를 측정하고 손실 함수를 줄이기 위해 경사 하강법을 이용
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 일반적인 벡터 내적 계산
dot_product = np.dot(a, b) # 32
# 코사인 유사도
sim = dot_product / (np.linalg.norm(a) * np.linalg.norm(b)) # 0.9746 (거의 1에 가까우므로 유사함)
# 입력 벡터
x = np.array([1.0, 2.0, 3.0])
# 가중치 벡터
w = np.array([0.5, -0.2, 0.3])
# 바이어스 - 원점을 강제로 지나야 하는 제약을 없애기 위해 사용
bias = 0.1
# 선형 회귀 예측값
y_pred = np.dot(w, x) + bias # 0.8
3. 행렬 연산
✅ 행렬 연산
import torch
# 2x2 행렬 생성
A = torch.tensor([[1, 2], [3, 4]])
B = torch.tensor([[5, 6], [7, 8]])
# 행렬 덧셈/뺄셈
C = A + B # 또는 torch.add(A, B) # tensor([[6, 8], [10, 12]])
D = A - B # 또는 torch.sub(A, B) # tensor([[-4, -4], [-4, -4]])
# 스칼라 곱
scalar = 2
E = scalar * A # 또는 torch.mul(scalar, A) # tensor([[2, 4],[6, 8]])
# 행렬 곱셈
F = A @ B # 또는 torch.matmul(A, B) # tensor([[19, 22], [43, 50]])
# 역 행렬
# 정수형 텐서는 역행렬 계산이 안 되므로 float으로 변환
A_inv = torch.linalg.inv(A.float()) # tensor([[-2.0000, 1.0000], [ 1.5000, -0.5000]])
# 전치 행렬
X = torch.randn(10, 5) # (10개 시퀀스, 5개 특성)
X_T = X.T # 전치 행렬 사용
print(X_T.shape) # torch.Size([5, 10])
- 행렬 덧셈/뺄셈 : 신경망 가중치 업데이트에 사용
- 전치 행렬 : CNN에서 커널 필터를 적용할 때, RNN에서 시계열 데이터를 처리할 때 사용
- 역 행렬 : 선형 회귀에서 최적 가중치를 찾을 때 사용
'코딩' 카테고리의 다른 글
[JAVA] 추가 공부 정리 (1) | 2025.03.22 |
---|---|
[Python] 행렬 미분 정리 (0) | 2025.02.19 |
[Python] Pandas 정리 (1) | 2025.02.05 |
[Python] Numpy 정리 (0) | 2025.02.05 |
[Chatbot] 챗봇 공부하면서 알게 된 용어 및 라이브러리 정리2 (0) | 2024.12.29 |