Boostcamp AI Tech (Day 006)
1. Numpy
- Numpy (Numerical Python)
- 파이썬의 고성능 과학 계산용 패키지
- matrix, vector 등 array 연산의 표준
- list에 비해 빠르고 메모리 효율적
- 반복문 없이 배열 처리 지원
- ndarray
- np.array([1, 4, 5, 8], float)
- ndarray 객체
- 하나의 데이터 타입만 배열에 넣을 수 있음
- dynamic typing not supported
- scalar, vector, matrix, n-tensor
- reshape
- -1: size를 기반으로 알아서 개수 선정
- np.flatten으로도 가능: 다차원 -> 1차원 array
- indexing, slicing
- array[0][2], array[0, 2]
- array[:, 2:]
- arange
- np.arange(start, end, step)
- python과 달리 float도 가능
- eye
- 대각선이 1인 행렬
- 시작 index 설정 가능 (k=0일 때 np.identity와 같음)
- diag
- 대각성분 추출
- 시작 index 설정 가능 (k=2)
- random sampling
- np.random.uniform()
- np.random.normal()
- np.random.exponential()
- operation functions
- .sum(), .mean(), .std()
- axis: operation functions 실행 시 기준이 되는 dimention 축
- (axis=0, axis=1, axis=2, …)
- concatenate((a, b), axis=0)
- vstack, hstack
- newaxis (arr = arr[np.newaxis, :])
- operations b/w arrays
- element-wise (same shape)
- dot product
- broadcasting (different shape)
- all & any
a = np.arange(10) np.all(a < 4) # False np.any(a < 4) # True a < 4 # return: boolean array # numpay array끼리 비교 시 역시 boolearn array를 return
- np.where
- np.where(condition, TRUE, FALSE)
- np.where(condintion): index 값 반환
np.where(a > 0, 3, 2) # array([3, 3, 2]) 처럼, True일 경우 3, False일 경우 2 return a = np.arange(10) np.where(a > 5) # array([6, 7, 8, 9],) 조건에 해당하는 인덱스 반환
- argmax, argmin
- array 내 최대(최소)값의 index 반환
a = np.array([1, 2, 3, 5, 7, 30]) np.argmax(a), np.argmin(a) # (5, 0) a = np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]]) np.argmax(a, axis=1), np.argmin(a, axis=0) # (array([3, 1, 1]), array[0, 0, 2, 2])
- array 내 최대(최소)값의 index 반환
- fancy index
a = np.array([2, 4, 6, 8], float) condition = np.array([0, 3, 1], int) # index 값이므로 반드시 int! a[condition] # array([2., 8., 4.]) a.take(condition) # take 함수를 이용해 bracket index와 같은 결과 반환 가능 # array([2., 8., 4.])
2. Vector
- Vector
- 숫자를 원소로 가지는 list 또는 array
- 공간에서 한 점 (원점으로부터 상대적 위치) 표현
- 스칼라곱 시 방향은 그대로, 길이만 변함
- 두 벡터의 덧셈: 다른 벡터로부터 상대적 위치 이동
- 벡터의 노름(norm)
- 원점에서부터의 거리
- L1 norm
- $\Vert x \Vert_1 = \sum_{i=1}^{d}\Vert x_i \Vert$
- 각 성분의 변화량의 절대값의 합
- robust 학습, lasso 회귀
- L2 norm
- $\Vert x \Vert_2 = \sqrt{\sum_{i=1}^{d} \vert x_i \vert^2}$
- 피타코갈스 정리를 이용해 유클리드 거리 계산
- laplace 근사, ridge 회귀
- 두 벡터 사이의 거리
- $\Vert y - x \Vert = \Vert x - y \Vert$
- 두 벡터 사이의 각도
- $\Vert y - x \Vert _2 = \Vert x - y \Vert _2$
- $cos\theta = \frac{ \Vert x \Vert _2^2 + \Vert y \Vert _2^2 - \Vert x - y \Vert _2^2}{2 \Vert x \Vert _2 \Vert y \Vert _2}$ (제 2 코사인법칙)
- $cos\theta = \frac{<x, y>}{ \Vert x \Vert _2 \Vert y \Vert _2}$
- $<x, y> = \sum_{i=1}^d{x_iy_i}$ (내적, inner product) np.inner()
- 내적의 해석
- 정사영(orthogonal projection)된 벡터의 길이와 관련이 있음
- proj(x) = 벡터 y로 정사영된 벡터 x의 그림자 길이
- $proj(x) = \Vert x \Vert cos\theta$
- $<x, y> = \Vert x \Vert _2 \Vert y \Vert _2cos\theta$
- 내적: 정사영의 길이를 \Vert y \Vert (벡터 y의 길이)만큼 조정한 값
- 두 벡터의 유사도(similarity) 측정에 사용 가능
3. Matrix
- matrix
- vector를 원소로 가지는 2차원 배열
- numpy에서는 row가 기본 단위 (행벡터가 기본)
- \[\begin{bmatrix} X_1 \\ X_2 \\ \vdots \\ X_n \end{bmatrix}\]
- (Xi: 행벡터 -> i 번째 데이터)
- $X = (x_{ij})$
- $X^T = (x_{ji})$
- matrix multiplication
- $XY = \Big(\sum_kx_{ik}y_{kj}\Big)$
- X의 i번째 행벡터와, Y의 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬 계산
- X @ Y (numpy 에서는 @ 사용)
- 두 행렬의 내적
- $XY^T = \Big(\sum_kx_{ik}y_{jk}\Big)$
- np.inner: i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬 계산
- 수학에서 말하는 내적과 다르다. (수학에선 보통 $tr(XY^T)$를 내적으로 계산)
- 행렬의 해석
- 벡터공간에서 사용되는 연산자(operator)
- 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있음
- 행렬 A: m차원의 공간에 있는 X를, n차원의 공간에 있는 Z로 보내는 연산자
- $Z = AX$
- \[\begin{equation} \begin{bmatrix} z_1 \\ z_2 \\ \vdots \\ z_n \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & \cdots && a_{1m} \\ a_{21} \\ \vdots \\ a_{n1} & & & & a_{nm} \end{bmatrix} \begin{bmatrix}x_1 \\ x_2 \\ \vdots \\ x_m \end{bmatrix} \end{equation}\]
- inverse matrix
- $A^{-1}$
- 행과 열의 크기가 같고 det != 0 인 경우 계산 가능
- np.linalg.inv()
- pseudo-inverse (유사역행렬, Moore-Penrose inverse)
- $A^+ = (A^TA)^{-1}A^T$ (when n >= m)
- $A^+ = A^T(AA^T)^{-1}$ (when n >= m)
- np.linalg.pinv()
- 연립방정식 해 구할 때 이용 가능
- linear regression equation 찾을 때 이용 가능 ($X\beta = \hat{y} \approx y$)