Post

2024.06.30

머신러닝을 다루기 위한 기초수학을 공부합니다.


  • 벡터
    숫자를 원소로 가지는 리스트 or 배열
    == 원점에서의 상대적 위치

벡터의 노름: 원점에서의 거리
L1 norm: 각 성분의 변화량 절대값의 합
L2 norm: 유클리드 거리(성분곱의 합에 제곱근 연산)
=> 기하학적 성질에 따라 두가지 모두 사용

L1 norm 상의 원 => Robust 학습, Lasso 회귀
L2 norm 상의 원 => Laplace 근사, Ridge 회귀

1
2
3
4
5
6
7
8
9
10
11
def l1_norm(x):
    x_norm = np.abs(x) #절댓값
    x_norm = np.sum(x_norm)
    return x_norm

def l2_norm(x):
    x_norm = x*x
    x_norm = np.sum(x_norm)
    x_norm = np.sqrt(x_norm) #제곱근
    return x_norm
# 또는 np.linalg.norm(x)
  • 두 벡터 사이의 거리 => 유클리드 거리 사용
    즉, 벡터의 뺄셈 이용 (순서 바뀌어도 결과는 동일)
  1. Numpy 라이브러리 이용
1
dist = np.linalg.norm(a - b) #L2 norm
  1. scipy 라이브러리의 distance 모듈 이용
1
dist = distance.euclidean(a, b)
  • 두 벡터 사이의 각도 => L2 norm만 가능
1
2
3
4
5
# 라디안 단위 각도 계산
def angle(x, y):
    v = np.inner(x, y) / (l2_norm(x)*l2_norm(y)) # 분자:inner product(내적)
    theta = np.arccos(v) #코사인의 역함수, 즉, 주어진 코사인 값에 해당하는 각 반환
    return theta
  • 내적(inner product)
    정사영(orthogonal projection)의 길이를 벡터 y의 길이만큼 조정한 값 == ||y|| Proj(x)
    => 벡터 간의 유사도 측정시 사용
    Proj(x) == ||x||cosθ

즉, 벡터 x와 y의 내적: x의 노름 x y의 노름 x 두 벡터 사이의 각도

1
dot_product = np.dot(a, b)

  • 행렬
  1. 벡터를 원소로 가지는 2차원 배열(n x m 행렬)
  2. 벡터공간에서 사용되는 연산자
    행렬곱을 통해 벡터(점)를 다른 차원의 공간으로 보냄
    => 패턴 추출 or 데이터 압축
  • 전치행렬
    행과 열의 인덱스가 바뀐 행렬
  • 행렬 곱셈
    i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬 계산
1
X @ Y

np.inner은 i번째 행벡터와 j번째 벡터 사이의 내적을 성분으로 가지는 행렬을 계산

  • 역행렬 (inverse matrix)
    행과 열 숫자가 같고, 행렬식(determinant)이 0이 아닌 경우에만 가능
1
np.linalg.inv(X) #inverse 의미

위 조건이 성립되지 않을 경우,
유사역행렬(pseudo-inverse) or 무어-펜로즈(Moore-Penrose) 역행렬 사용

1
np.linalg.pinv(Y) #pseudo inverse
  • 선형회귀분석
    무어 펜로즈 역행렬을 사용해 데이터를 선형모델로 해석하는 선형회귀식(L2 norm을 최소화) 찾을 수 있음
    n >= m인 경우: 데이터가 변수 개수보다 많거나 같아야 함
1
2
3
4
5
6
7
8
9
10
#1. Scikit Learn 을 활용한 회귀분석
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)

#2. Moore-Penrose 역행렬
X_ = np.array([np.append(x,[1]) for x in X]) # intercept 항 추가
beta = np.linalg.pinv(X_) @ y
y_test = np.append(x, [1]) @ beta

네이버 boostcourse의 인공지능 기초 다지기 강의를 참조함

This post is licensed under CC BY 4.0 by the author.