Mathematics for Artificial Intelligence

2022. 12. 28. 21:04BOOTCAMP/boostcamp AI Tech Pre-Course

1강. 벡터가 뭔가요?

  • 벡터는 숫자를 원소로 가지는 리스트(list) 또는 배열(array)이다.
  • 백터는 공간에서 한 점을 나타낸다.
  • 벡터는 원점으로부터 상대적 위치를 표현한다.
  • 벡터에 숫자를 곱해주면 길이만 변한다.
  • 벡터끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있다.
  • 벡터끼리 같은 모양을 가지면 성분곱(Hadamard product)을 계산할 수 있다.
import numpy as np
x = np.array([1, 7, 2])
y = np.array([5, 2, 1])

x + y
array([6, 9, 3])

x - y
array([-4,  5,  1])

x * y
array([ 5, 14,  2])

벡터의 덧셈, 뺄셈을 알아보자

  • 벡터는 공간에서 한 점을 나타낸다.
  • 벡터는 원점으로부터 상대적 위치를 표현한다.
  • 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치이동을 표현한다.

벡터의 노름 구해보기

  • 벡터의 노름(norm)은 원점에서부터의 거리를 말한다.
  • L1 - 노름은 각 성분의 변화량의 절댓값을 모두 더한다.
  • L2 - 노름은 피타고라스 정리를 이용해 유클리드 거리를 계산한다.
def ll_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

왜 다른 노름을 소개하나요?

  • 노름의 종류에 따라 기하학적 성질이 달라진다.
  • 머신러닝에선 각 성질들이 필요할 때가 있으므로 둘 다 사용한다.

L1 - 노름 상의 원: {X: ||X||1(작은 1) = 1} 예) Robust 학습, Lasso 회귀

L2 - 노름 상의 원: {X: ||X||2(작은 2) = 1} 예) Laplace 근사, Ridge 회귀

 

두 벡터 사이의 거리를 구해보자!

  • L1, L2 - 노름을 이용해 두 벡터 사이의 거리를 계산할 수 있다.
  • 두 벡터 사이의 거리를 계산할 때는 벡터의 뺄셈을 이용한다.
  • 뺄셈을 거꾸로 해도 거리는 같다.

||y - x|| = ||x - y||

 

두 벡터 사이의 각도 구해보기

  • 두 벡터 사이의 거리를 이용하여 각도도 계산해 볼 수 있을까?
  • 제2 코사인 법칙에 의해 두 벡터 사이의 각도를 계산할 수 있다.
  • 분자를 쉽게 계산하는 방법이 내적이다.

내적은 np.inner을 이용해서 계산한다.

def angle(x, y):
    v = np.inner(x, y) / (l2_norm(x) * l2_norm(y))
    theta = np.arccos(v)
    return theta

내적은 어떻게 해석할까?

  • 내적은 정사영(orthogonal projection)된 벡터의 길이와 관련 있다.
  • Proj(x)는 벡터 y로 정사영된 벡터 x의 그림자를 의미한다.
  • proj(x)의 길이는 코사인법칙에 의해 ||x||cos@가 된다.
  • 내적은 정사영의 길이를 벡터 y의 길이 ||y||만큼 조정한 값이다.
  • 내적은 두 벡터의 유사도(similarity)를 측정하는 데 사용 가능하다.

2강 행렬은 뭔가요?

  • 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열입니다.
  • 행렬은 행(row)과 열(column)이라는 인덱스(index)를 가집니다.
  • 행렬의 특정 행(열)을 고정하면 행(열)벡터라 부릅니다.

행렬을 이해하는 방법(1)

  • 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타낸다.
  • 행렬의 행벡터 Xi는 i번째 데이터를 의미한다.
  • 행렬의 xij는 i번째 데이터의 j번째 변수의 값을 말한다.

행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱

  • 행렬은 벡터를 원소로 가지는 2차원 배열이다.
  • 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있다.
  • 성분곱은 벡터와 똑같습니다. 스칼라곱도 벡터와 차이가 없다.

행렬 곱셈

  • 행렬 곱셈(matrix multiplication)은 i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
  • 행렬곱은 X의 열의 개수와 Y의 행의 개수가 같아야 한다.
import numpy as np
X = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])

Y = np.array([[0, 1],
              [1, -1],
              [-2, 1]])

X @ Y
array([[-8,  6],
       [ 5,  2],
       [-5,  1]])

행렬도 내적이 있을까?

  • 넘파이의 np.inner는 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다.
  • 수학에서 말하는 내적과는 다르므로 주의해야한다.
X = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])

Y = np.array([[0, 1, -1],
              [1, -1, 0]])
              
np.inner(X, Y)
array([[-5,  3],
       [ 5,  2],
       [-3, -1]])

행렬을 이해하는 방법(2)

  • 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해한다.
  • 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있다.

역행렬 이해하기

  • 어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라 부르고 A-1라 표기한다. 역행렬은 행과 열 숫자가 같고, 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있다.
  • 역행렬 연산은 n = m 일 때만 가능하고, 행렬 A의 행렬식이 0이 되면 안 된다.
  • 만일 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+을 이용한다.
X = np.array([[1, -2, 3],
              [7, 5, 0],
              [-2, -1, 2]])

np.linalg.inv(X)
array([[ 0.21276596,  0.0212766 , -0.31914894],
       [-0.29787234,  0.17021277,  0.44680851],
       [ 0.06382979,  0.10638298,  0.40425532]])

X @ np.linalg.inv(X)
array([[ 1.00000000e+00, -1.38777878e-17,  0.00000000e+00],
       [-2.22044605e-16,  1.00000000e+00, -5.55111512e-17],
       [-2.77555756e-17,  0.00000000e+00,  1.00000000e+00]])

Y = np.array([[0, 1],
              [1, -1],
              [-2, 1]])

np.linalg.pinv(Y)
array([[ 5.00000000e-01,  4.09730229e-17, -5.00000000e-01],
       [ 8.33333333e-01, -3.33333333e-01, -1.66666667e-01]])

np.linalg.pinv(Y) @ Y
array([[ 1.00000000e+00, -2.22044605e-16],
       [ 0.00000000e+00,  1.00000000e+00]])

응용 1: 연립방정식 풀기

  • np.linalg.pinv를 이용하면 연립방정식의 해를 구할 수 있다.

Ax = b

  • n <=m이면 무어=펜로즈 역행렬을 이용하면 해를 하나 구할 수 있다.

응용 2: 선형회귀분석

  • np.linalg.pinv를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있다.

n>=m인 경우: 데이터가 변수 개수보다 많거나 같아야 한다.

선형회귀분석은 연립방정식과 달리 행이 더 크므로 방정식을 푸는 건 불가능하다.

  • sklearn의 LinearRegression과 같은 결과를 가져올 수 있다.
# scikit Learn을 활용한 회귀분석
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X, y)
y_test = model.predict(x_test)

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

'BOOTCAMP > boostcamp AI Tech Pre-Course' 카테고리의 다른 글

선형독립과 선형종속  (0) 2023.01.01
선형방정식과 선형시스템  (0) 2022.12.29
Numerical Python - numpy  (0) 2022.12.28
File / Exception / Log Handling  (0) 2022.12.27
Module and Project  (0) 2022.12.27