AI Tech 1주차 - DAY 1

YeonJu Kim·2021년 8월 5일
0

Boostcamp AI Tech 2nd

목록 보기
1/13
post-thumbnail

1. 벡터

벡터란 무엇인가?

  • 숫자를 원소로 가지는 리스트 또는 배열
  • 공간에서의 한 점
  • 원점으로부터 상대적 위치

벡터의 연산

  • 같은 모양을 가지는 벡터끼리는 덧셈, 뺄셈, 성분곱(Hadamard product) 가능
  • 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치이동을 표현

<성분곱>

import numpy as np
x = np.array([1,2,3])
y = np.array([-1,-2,-3])
x * y
>> array([-1,-4,-9])

벡터의 노름(norm)

  • 원점에서부터의 거리
  • L1-norm : 각 성분의 변화량의 절대값의 합 (예 : Robust 학습, Lasso 회귀)
  • L2-norm : 유클리드 거리 (Laplace 근사, Ridge 회귀)

    norm의 종류에 따라 기하학적 성질이 달라진다. 그렇기 때문에 달라진 기하세계에서 학습을 진행하게 될 때, 다른 성질을 이용해 다양한 종류의 학습에 사용하고, 각 기계학습 방법론에서 어떤 norm을 사용할지 결정할 때 각 norm의 기하학적 성질에 의존한다.

두 벡터 사이의 각도

cosθ=x22+y22xy222x2y2=<x,y>x2y2cos\theta = \frac{||x||_2^2 + ||y||_2^2 - ||x-y||_2^2}{2||x||_2||y||_2} = \frac{<x,y>}{||x||_2||y||_2}\\
<x,y>=i=1dxiyi<x,y> = \sum_{i=1}^d{x_iy_i}

내적

  • 내적은 벡터 y 또는 벡터 x의 길이만큼 조정한 값
  • 두 데이터 or 패턴의 유사도(similarity)를 측정하는데 사용할 수 있다.

    <x,y>=x2y2cosθ(x2,y2:scalar)<x,y> = ||x||_2||y||_2cos\theta\\(||x||_2, ||y||_2 : scalar)

2. 행렬

  • 벡터를 원소로 가지는 2차원 배열. 각 행벡터는 데이터이고, 행렬은 이 데이터를 모은 배열이다.
  • 행(열)벡터 : 특정 행(열)을 고정한 벡터
  • 전치행렬(Transpose matrix) : 행과 열의 인덱스가 바뀐 행렬
  • 공간에서의 여러 점을 나타낸다.

행렬 곱셈

  • numpy의 np.inner은 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산한다. 수학에선 보통 tr(XYT)tr(XY^T)를 내적으로 계산.
    ( XYT=kxikyjkXY^T = \sum_{k}{x_{ik}y_{jk}} )
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]])
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]])
  • 또한 행렬은 서로 다른 두 data를 연산시키는, 벡터공간에서의 연산자로도 이해할 수 있다.
  • 행렬곱을 통해 주어진 데이터의 ① 패턴을 추출할 수 있고, ② 데이터를 압축할 수도 있다.
    (모든 linear transform(행렬을 사용하는 연산자)는 행렬곱으로 계산 가능)

역행렬(inverse matrix)

  • 행렬 AA 의 연산을 거꾸로 되돌리는 행렬. A1A^{-1}
  • 행=열 이면서 det() != 0인 경우에만 계산할 수 있다. ( np.linalg.inv(A))
  • 이 경우가 아니라면, 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+A^+을 이용한다. (np.linalg.pinv(A))
    n>=m 이면 A+A=IA^+A = I,
    n<=m 이면 AA+=IAA^+ = I가 성립한다.

    (참고 : 의사역행렬의 기하학적 의미)

(1) 연립방정식 풀기 (n<=m)

n<=m 인 경우는, 식의 수보다 변수의 수가 많기 때문에 (부정), psudo inverse로 여러 해 중 하나를 구할 수 있다.

Ax=bA(A+b)=bx=A+b=AT(AAT)1bAx = b ⇒ A(A^+b) = b\\ ∴ x = A^+b = A^T(AA^T)^{-1}b

(2) 선형회귀분석 구현 (n>=m)

  • np.linalg.pinv 로 데이터를 linear model로 해석하는 선형회귀식을 구할 수 있다.
  • 계수 β\beta를 구하는 식을 구현해 보자

    Xβ=y^yβ=X+yβ=(XTX)1XTy(n>=m,X+X=I)X\beta = \hat{y}≈y\\ ⇒ \beta = X^+y ⇒ \beta = (X^TX)^{-1}X^Ty \\ (n>=m, X^+X = I)\\

    선형회귀분석은 데이터 수>=변수의 수 이므로 (불능) 정확한 값을 구하는 것은 불가능하다. 따라서 yy에 근접하는(L2-norm을 최소화 하는) y^\hat{y}를 찾아야 한다. ( minβyy^2min_{\beta}||y-\hat{y}||_2)

# moore penrose 역행렬
X_ = np.array([np.append(x,[1]) for x in X])

beta = np.linalg.pinv(X_) @ y
y_test =  np.array([np.append(x,[1]) for x in x_test]) @ beta
y_test

주의해야 할 점은, Xβ=yX\beta = y식의 경우, y절편의 값이 없기 때문에 X의 각 행에 1을 append 해 주어야 한다.

Assignment

python 의 기초적인 list 및 변수 사용법을 학습하는 과제
주어진 리스트에서 가장 큰 수, 가장 작은 수, 평균, 중간값을 return하는 함수 4개를 구현하는 과제이다.

구현

#######################
# Basic Math          #
#######################

def get_greatest(number_list):
    """
    주어진 리스트에서 가장 큰 숫자를 반환함
    """
    greatest_number = max(number_list)
    return greatest_number


def get_smallest(number_list):
    """
    주어진 리스트에서 제일 작은 숫자를 반환함
    """
    smallest_number = sorted(number_list)[0]
    return smallest_number


def get_mean(number_list):
    """
    주어진 리스트 숫자들의 평균을 구함.
    """
    mean = sum(number_list)/len(number_list)
    return mean


def get_median(number_list):
    """
    주어진 리스트 숫자들의 중간값을 구함.
    """
    number_list.sort()
    median_list = number_list[(len(number_list)-1)//2 : len(number_list)//2+1]
    median = sum(median_list)/len(median_list)
    return median

python 내장함수를 사용했고, get_median 함수는 number_list index 계산 후 slice를 해 구현했다.

# 5 -> s[2:3]
# 4 -> s[1:3]

결과

피어세션

각자 자기소개 후 조 이름, 그라운드 룰, 협업툴 등을 정했다.

회고

  • 첫주는 pre-course에서 공개되었던 강의들로 구성이 되었는데, 이미 들었던 강의였지만 다시 들으니 새로운 부분이 또 있었다.
  • 과제는 python 내장함수를 사용했는데, 앞으로는 naive한 내장함수보다, numpy로 문제를 풀며 익혀야겠다.
  • 부스트캠프에 깊게 몰입하기 위해 공부, 운동 등 나만의 루틴을 짜고 매일 지치지 않게 반복하자 !

0개의 댓글