해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
최성철 교수님 - Numpy(Numerical python)
numpy의 주된 내용은 "어떻게 행렬을 코드로 표현할 것인가?"입니다. numpy는 행렬을 표현하고 다양한 선형대수 연산들을 활용할 수 있습니다. 비교적 파이썬에서 리스트를 통해서 계산하는 것보다 빠른 계산을 지원하고 있고 반복문 없이 데이터 배열에 대한 처리를 지원합니다. 또한 numpy는 C로 구현되어 있어서 성능을 확보할 수 있지만 C의 특징처럼 dynamic typing(동적 타이핑)을 지원하지 않는 특징이 있습니다.
1) ndarray
numpy는 np.array 함수를 활용해서 배열을 생성합니다. 이때, 생성된 객체를 ndarray라고 부릅니다. 기존의 리스트는 여러가지 타입이 들어갈 수 있었지만 numpy는 하나의 데이터 type만 배열에 넣을 수 있습니다. 추가적으로 list와 가장 큰 차이점은 dynamic typing을 지원하지 않습니다. numpy array는 차례대로 값이 들어가게 되면서 메모리에 접근성이 좋습니다. 반면, 파이썬 리스트는 리스트에 해당 값의 주소 값을 가지고 있어서 변형은 쉬우나 numpy와 비교해서 메모리 접근성이 떨어집니다. array의 rank에 따라 불리는 이름이 따로 있는 데, 아래의 표로 정리해봤습니다.
Rank | Name | Example |
0 | scalar | 7 |
1 | vector | [10,10] |
2 | matrix | [[10,10],[15,15]] |
3 | 3-tensor | [[[1,5,9],[2,6,10]],[[3,7,11],[4,8,12]]] |
n | n-tensor |
-
명령어 정리
명령어 | 특징 |
shape | numpy array의 dimension 구성을 반환 |
dtype | array 전체의 데이터 type을 반환 |
ndim | rank의 값을 반환 |
size | data 개수 반환 |
nbytes | ndarray object의 메모리 크기 반환 |
2) handling shape
-
명령어 정리
명령어 | 특징 |
reshape | array의 shape 크기를 변경, element의 개수는 소실되면 안됨. 행이나 열을 정해주고 나머지에 -1을 넣어주면 element에 맞춰서 조정함 |
flatten | 다차원 array를 1차원 array로 변환 |
3) indexing & slicing
list에서는 [0][0]으로 인덱스에 접근을 하지만, array에서는 [0,0]으로 접근합니다. matrix[row,col]으로 접근이 가능합니다. slicing은 리스트와 달리 행과 열 부분을 나눠서 slicing이 가능합니다. matrix의 부분 집합을 추출할 때 유용하게 사용됩니다.
4) creation function
-
명령어 정리
명령어 | 특징 |
arange | array의 범위를 지정하여 해당 값의 리스트를 생성하는 명령어(range 유사), step은 float도 가능 |
zeros | 0으로 가득찬 ndarray 생성 |
ones | 1로 가득찬 ndarray 생성 |
empty | shape만 주어지고 비어있는 ndarray 생성 (Memory initialization 되지 않는다. 해당 주소 있는 값이 그대로 출력되기도 함) |
something_like | zeros_like, ones_like, empty_like가 있으며 기존의 ndarray와 동일한 ndarray를 생성 |
identity | 단위행렬 생성 |
eye | 대각선이 1인 행렬(k값이 시작, index 변경 가능) |
diag | 대각행렬의 값을 추출(k값이 시작, index 변경 가능) |
np.random.uniform | 균등 분포로 부터 random sampling으로 array를 생성 |
np.random.normal | 정규 분포로 부터 random sampling으로 array를 생성 |
5) operations functions
-
명령어 정리
명령어 | 특징 |
sum | ndarray의 element들의 합, list의 sum과 동일한 기능 |
* axis | 모든 operation function을 실행할 때 기준이 되는 축, axis는 1차원부터 생겨진 순서대로 값이 제일 큽니다. 1차원에서 행이 0이면, 2차원에서 행이 1, 열이 0처럼 새로 생겨나는 것이 0으로 넘버링 됩니다. |
vstack | vertical stack으로, vertical로 numpy array를 합치는 함수 |
hstack | horizonal stack으로, horizonal로numpy array를 합치는 함수 |
newaxis | 하나의 축을 추가할 때 사용 |
기타 | mean, std 다양한 수학 함수가 사용이 가능 |
6) array operations
array간의 기본적인 사칙연산을 지원합니다. 같은 위치끼리 연산하는 element-wise operations이 있습니다. element-wise operations는 array의 shape가 동일할 때 발생하는 연산을 이야기합니다. array operation 중에 transpose(전치 행렬)는 전치 행렬 만들 때 사용하는 명령어입니다. 추가적으로, array의 shape가 동일하지 않을 때 하는 연산을 broadcasting이라고 하는데, 스칼라-매트릭스, 벡터-매트릭스처럼 shape가 다른 배열 간의 연산을 말합니다.
7) comparisons
comparisons도 element-wise, broadcasting 연산이 적용됩니다.
-
명령어 정리
명령어 | 특징 |
all | 전부 다 True이면 True |
any | 하나라도 True이면 True |
logical_and | 둘다 True면 True |
logical_not | True는 False, False는 True |
logical_or | 둘 중 하나라도 True면 True |
np.where(조건, True값, False값) | 조건이 맞으면 True값이, 조건이 틀리면 False, 조건이 맞는 index 값을 반환하기도 함. |
isnan | null 값인지 확인 |
isfinite | 유한숫자인지 확인 |
argmax/min | array 내 최대/최소값의 index를 반환(axis 기반의 반환도 가능) |
argsort | 작은 값부터 인덱스 값 반환 |
8) boolean, fancy index
boolean index는 특정 조건에 따른 값을 배열 형태로 추출합니다. comparison operation 함수들도 모두 사용가능하고, 특정한 조건이 True인 값을 꺼낼 수 있는 기능입니다. fancy index는 numpy에서 array(무조건 integer로 선언)를 index value로 사용해서 값 추출합니다.(take와 비슷한 방법)
9) numpy data i/o
loadtxt(load), savetxt(save) 명령어들은 text type의 데이터를 읽고 저장하는 기능을 수행하는 명령어입니다.
임성빈 교수님 - Mathematics for Artificial Intelligence
1) 벡터는 무엇인가?
벡터는 숫자를 원소로 가지는 리스트(list) 또는 배열(array)입니다. np.array()는 행 벡터로 나오게 됩니다. 벡터는 공간에서 한 점을 나타냅니다. 1차원 공간에서는 벡터는 수직선상에 놓인 숫자로 표현하게 됩니다. 2차원 공간에서의 벡터는 x축과 y축으로 이뤄진 좌표평면의 한 점을 나타내는 것입니다. 벡터는 원점으로부터 상대적 위치를 표현합니다.
2) 벡터의 연산
벡터의 연산에는 여러가지 종류가 있지만, 기본적인 연산들을 지원하고 있습니다. 벡터에 숫자를 곱해주면 길이만 변하게 됩니다(스칼라 곱). 벡터끼리 동일한 모양을 가지면 덧셈, 뺄셈을 계산할 수 있습니다(다른 모양은 안됩니다). 벡터 같은 모양을 가지면 성분곱(Hadamard product)을 구할 수 있습니다(같은 위치끼리 곱셈-elementwise operations). 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치 이동을 표현합니다. 뺄셈은 반대방향의 벡터를 더해주는 것으로 생각하면 쉽습니다. 벡터의 노름(norm)은 원점에서부터의 거리를 말합니다. 임의의 차원 d에 대해 성립하는 것을 기억해야 합니다. l1-노름은 각 성분의 변화량의 절댓값의 합으로 계산합니다. l2-노름은 원점에서 x까지 가는 직선의 거리(피타고라스 정리를 이용해 유클리드 거리)를 계산합니다. 여기서 l2-norm은 np.linalg.norm을 이용해서 구현할 수 있습니다.
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
노름의 종류에 따라 기하학적 성질이 달라집니다. l1-노름 상의 원(마름모꼴)과 l2-노름 상의 원(원꼴)이 다릅니다. 머신러닝에서는 각 성질들이 필요할 때가 있어서 둘 다 사용합니다. l1-norm(Robust학습, Lasso 회귀), l2-norm(Laplace 근사, Ridge 회귀)에서 사용됩니다. l1,l2-노름을 활용해서 두 벡터 사이의 거리를 계산할 수 있습니다. 두 벡터 사이의 거리를 계산할 때는 벡터의 뺄셈을 이용합니다. 뺄셈을 거꾸로 해도 거리는 동일합니다. l2-norm과 두 벡터 사이의 거리를 사용해서 각도를 계산할 수 있습니다. 이때, 사용되는 법칙은 제2 코사인 법칙입니다. 제2 코사인 법칙에서의 분모를 구할 때, 내적을 활용하면 쉽게 구할 수 있습니다. 내적은 np.inner를 이용해서 계산할 수 있습니다.
내적은 어떻게 설명할까요? 내적은 정사영(othogonal projection)된 벡터의 길이와 관련이 있습니다. Proj(x)는 벡터 y로 정사영된 벡터 x의 그림자를 의미합니다. Proj(x)의 길이는 코사인 법칙에 의해서 x의 길이*$\cos\theta$가 됩니다. 내적은 정사영의 길이를 벡터 y의 길이만큼 조정한 값이다. 내적은 두 벡터의 유사도(similarity)를 측정하는 데 사용이 가능합니다.
임성빈 교수님 - Mathematics for Artificial Intelligence
1) 행렬은 뭔가요?
행렬은 벡터를 원소로 가지는 2차원 배열입니다. numpy에서는 행이 기본 단위입니다. 행렬은 행과 열이라는 인덱스를 가집니다. $X$ =($x_{ij}$)는 i번째 행, j번째 열에 있는 원소를 표현하는 것이라고 보면 됩니다. 전치행렬(Transpose matrix)은 행과 열의 인덱스가 바뀐 행렬입니다.
2) 행렬을 이해하는 방법
벡터는 공간에서의 한 점을 나타냈다면, 행렬은 여러 점들을 나타냅니다. 행렬의 행 벡터 $x_{i}$는 $i$번째 데이터를 의미합니다. 행렬의 $x_{ij}$는 $i$번째 데이터의 $j$번째 변수의 값을 말합니다. 행렬끼리 같은 모양을 가지면 덧셈과 뺄셈을 계산할 수 있습니다(벡터와 동일). 행렬의 성분곱도 각 인덱스 위치끼리 곱하기 때문에 벡터의 곱과 동일합니다. 행렬의 스칼라곱도 벡터와 차이가 없습니다. 행렬 곱셈(matrix multiplication)은 $i$번째 행 벡터와 $j$번째 열 벡터 사이의 내적을 성분으로 가지는 행렬을 계산합니다. 이때, $X$의 열의 개수와 $Y$의 행의 개수가 같아야 합니다. 행렬의 곱셈은 대부분 교환 법칙이 성립하지 않습니다. numpy에서는 @를 연산으로 활용합니다.
하지만, numpy에서의 내적은 앞에서 이야기한 것과 조금은 다른 의미를 가집니다. np.inner는 $i$번째 행벡터와 $j$벡터 행 벡터 사이의 내적을 성분으로 가지는 행렬을 계산하기 때문에 수학에서 말하는 내적과는 다릅니다. np.inner를 사용하려면 반드시 transpose를 해서 사용해줘야 합니다. 이때도 행 벡터의 길이가 같아야지 내적을 계산할 수 있습니다.
행렬은 벡터공간에서 사용되는 연산자로 이해할 수 있습니다. 행렬을 통해 벡터를 다른 차원의 공간으로 보낼 수 있으며, 패턴을 추출할 수 있고 데이터를 압축할 수도 있습니다. 모든 선형 변환(linear transform)은 행렬곱으로 계산할 수 있습니다.
역행렬은 어떤 행렬 A의 연산을 거꾸로 돌리는 행렬입니다. 역행렬은 행과 열 숫자가 동일해야하고, 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있습니다. 역행렬의 경우 교환 법칙을 성립합니다. 기존의 행렬과 역행렬을 곱하게 되면 항등 행렬을 구할 수 있습니다. 항등 행렬은 어떤 것을 곱하던지 자기 자신이 되는 항등원과 같은 역할은 하는 행렬입니다. 역행렬은 파이썬에서 np.linalg.inv(x)로 구할 수 있습니다.
3) 유사역행렬(pseudo-inverse)
만약, 역행렬을 계산할 수 없다면 유사 역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+를 이용합니다. 주의해야 할 점은 $n \ge m$이면 $A^{+}*A = I$가 성립하고, $n \le m$이면 $A*A^{+} = I$만 성립합니다. 유사 역행렬 구하는 방법은 np.linalg.pinv(x)로 파이썬에서 구할 수 있습니다.
2. 피어 세션 정리
알고리즘 4문제 풀어본 것 이야기해보기, 수업 질문
3. 과제 진행 상황
과제 풀기 완료
한 문제 틀렸는 데, $\theta$를 구해야 하는데 $cos \theta$를 구해서 틀림