강의 복습 내용
[DAY 6] Numpy / 벡터 / 행렬
[AI Math 0강] numpy
- numpy
- Numerical Python
- 파이썬의 고성능 과학 계산용 패키지
- Matric와 Vector와 같은 Array 연산의 사실상의 표준
- 한글에서는 넘파이로 주로 통칭
- 누군가는 넘피/늄파이라고 부르기도 함
- 일반 List에 비해 빠르고, 메모리 효율적
- 반복문 없이 데이터 배열에 대한 처리를 지원함
- 선형대수와 관련된 다양한 기능을 제공함
- C, C++, 포트란 등의 언어와 통합 가능
- import numpy as np
- numpy의 호출 방법
- 일반적으로 numpy는 np라는 alias(별칭)를 이용해서 호출함
- 특별한 이유는 없음, 세계적인 약속같은 것
- numpy는 np.array 함수를 활용하여 배열을 생성함 -> ndarray
- numpy는 하나의 데이터 type만 배열에 넣을 수 있음
- List와 가장 큰 차이점 -> dynamic typing not supported
- C의 Array를 사용하여 배열을 생성함
- shape : numpy array의 dimension 구성을 반환함
- dtype : numpy array의 데이터 type을 반환함
- array의 RANK에 따라 불리는 이름이 있음
- 0 Rank : scalar
- 1 Rank : vector
- 2 Rank : matrix
- 3 Rank : 3-tensor
- n Rank : n-tensor
- C의 data type과 compatible
- nbytes : ndarray object의 메모리 크기를 반환함
- reshape : Array의 shape의 크기를 변경함, element의 갯수는 동일
- flatten : 다차원 array를 1차원 array로 변환
- indexing for numpy array
- list와 달리 이차원 배열에서 [0,0] 표기법을 제공함
- matrix일 경우, 앞은 row 뒤는 column을 의미함
- slicing for numpy array
- list와 달리 행과 열 부분을 나눠서 slicing이 가능함
- matrix의 부분 집합을 추출할 때 유용함
- arange : array의 범위를 지정하여, 값의 list를 생성하는 명령어
- zeros : 0으로 가득찬 ndarray 생성
- ones : 1로 가득찬 ndarray 생성
- empty : shape만 주어지고 비어있는 ndarray 생성 (memory initialization이 되지 않음)
- something_like : 기존 ndarray의 shape 크기 만큼 1, 0 또는 empty array를 반환
- identity : 단위 행렬(i 행렬)를 생성함
- eye : 대각선인 1인 행렬, k값의 시작 index의 변경이 가능
- diag : 대각 행렬의 값을 추출함
- random : 데이터 분포에 따른 sampling으로 array를 생성
- sum : ndarray의 element들 간의 합을 구함, list의 sum 기능과 동일
- axis : 모든 operation function을 실행할 때, 기준이 되는 dimension 축
- mean : ndarray의 element들 간의 평균 반환
- std : ndarray의 element들 간의 표준 편차를 반환
- mathemarical functions : 그 외에도 다양한 수학 연산자를 제공함 (np.something 호출)
- concatenate : numpy array를 합치는 (붙이는) 함수
- Dot product : Matrix의 기본 연산, dot 함수 사용
- transpose : transpose 또는 T attribute 사용
- broadcasting : Shape이 다른 배열 간의 연산을 지원하는 기능
- timeit : jupyter 환경에서 코드의 퍼포먼스를 체크하는 함수
- 일반적으로 속도는 for loop < list comprehension< numpy이다.
- 100,000,000번의 loop가 돌 때, 약 4배 이상의 성능 차이를 보임
- Numpy는 C로 구현되어 있어, 성능을 확보하는 대신 파이썬의 가장 큰 특징인 dynamix typing을 포기함
- 대용량 계산에서는 가장 흔히 사용됨
- Concatenate처럼 계산이 아닌, 할당에서는 연상 속도의 이점이 없음
- any : 하나라도 조건에 만족한다면 True
- all : 모두가 조건에 만족한다면 True
- numpy가 배열의 크기가 동일 할 때, element 간의 비교의 결과를 Boolean type으로 반환
- np.logical_and, np.logical_or, np.logical_not
- np.where :
- argmax & argmin : array 내 최댓값 또는 최솟값의 index를 반환함
- boolean index : 특정 조건에 따른 값을 배열 형태로 추출, Comparison operation 함수들도 모두 사용 가능
- fancy index : numpy는 array를 index value로 사용해서 값 추출, matrix 형태의 데이터도 가능
- loadtxt & savetxt : text type의 데이터를 읽고, 저장하는 기능
[AI Math 1강] 벡터가 뭐에요?
- 벡터가 뭔가요?
- 벡터는 숫자를 원소로 가지는 리스트(list) 또는 배열(array)입니다.
- 벡터는 공간에서 한 점을 나타냅니다.
- 벡터는 원점으로부터 상대적 위치를 표현합니다.
- 벡터에 숫자를 곱해주면 길이만 변합니다. (스칼라곱)
- 벡터끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있습니다.
- 벡터끼리 같은 모양을 가지면 성분곱(Hadamard product)을 계산할 수 있다.
- 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치이동을 표현합니다.
- 벡터의 노름(norm)은 원점에서부터의 거리를 말합니다.
- L1-노름은 각 성분의 변화량의 절대값을 모두 더합니다.
- L2-노름은 피타고라스 정리를 이용해 유클리드 거리를 계산합니다.
- 노름의 종류에 따라 기하학적 성질이 달라집니다.
- 머신러닝에선 각 성질들이 필요할 때가 있으므로 둘 다 사용합니다.
- L1, L2-노름을 이용해 두 벡터 사이의 거리를 계산할 수 있습니다.
- 두 벡터 사이의 거리를 계산할 때는 벡터의 뺄셈을 이용합니다.
- 뺄셈을 거꾸로 해도 거리는 같습니다!
- 제2코사인 법칙에 의해 두 벡터 사이의 각도를 계산할 수 있습니다.
- 내적은 정사영(orthogonal projection)된 벡터의 길이와 관련 있습니다.
- Proj(x)의 길이는 코사인법칙에 의해 ∥x∥cosθ가 됩니다.
- 내적은 정사영의 길이를 벡터 y 의 길이 ∥y∥만큼 조정한 값입니다.
[AI Math 2강] 행렬이 뭐에요?
- 행렬은 뭔가요?
- 행렬(matrix)은 벡터를 원소로 가지는 2차원 배열입니다.
- 행렬은 행(row)과 열(column)이라는 인덱스(index)를 가집니다.
- 행렬의 특정 행(열)을 고정하면 행(열)벡터라 부릅니다.
- 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타냅니다.
- 행렬의 행벡터 xi는 i번째 데이터를 의미합니다.
- 행렬의 xij는 i번째 데이터의 j번째 변수의 값을 말합니다.
- 행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있습니다.
- 성분곱은 벡터와 똑같습니다.
- 스칼라곱도 벡터와 차이가 없습니다.
- 행렬 곱셈(matrix multiplication)은 i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산합니다. (numpy에선 @ 연산을 사용한다.)
- 넘파이의 np.inner는 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산합니다.
- 수학에서 말하는 내적과는 다르므로 주의!
- 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해합니다.
- 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있습니다.
- 행렬곱을 통해 패턴을 추출할 수 있고 데이터를 압축할 수도 있습니다.
- 어떤 행렬 A 의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이 라 부르고 A−1 라 표기한다.
- 역행렬은 행과 열 숫자가 같고 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있다. (numpy.linalg.inv로 구할 수 있다.)
- 만일 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A+를 이용한다. (numpy.linalg.pinv 로 구할 수 있다.)
- np.linalg.pinv를 이용하면 연립방정식의 해를 구할 수 있다.
- np.linalg.pinv를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있다.
- sklearn의 LinearRegression 과 같은 결과를 가져올 수 있다.
강의 리뷰 및 Q&A
- [AI Math 0강] numpy
- [AI Math 1강] 벡터가 뭐에요?
- [AI Math 2강] 행렬이 뭐에요?
코드 리뷰
- 공백 문자
str.strip() = ""
- 반복문과 조건문 밖에 미리 선언
result = None # 만일의 사태에 대비하여, 미리 선언
for i in range(10):
if i == 1:
result = i
result = user_input.lower() in ["h","help"]
- 정규 표현식이 시간 복잡도가 작다.
- 주석 < 가독성 좋은 코드
- else 지양
- 반복문 이전에 미리 호출하는 것이 좋다.
- main의 wrong_input 부분만 while을 해주는 것이 좋다.
- for문의 in 뒤쪽은 한 번만 호출 (따라서, 미리 선언할 필요가 없음)
{j:i for i,j in dictionary.items()} = dict(map(reversed,dictionary.items()))
- list보다 set이 빠르다.
- 과제에서 mock 모듈로 자체적으로 테스트할 수 있다.
- 1line = 79char
- 리스트 컴프리헨션에서 중첩은 지양
퀴즈 결과 회고
[AI Math 1강 퀴즈] 벡터-1~5
- 벡터의 L1-노름을 계산 (O)
ans : 6
- 벡터의 L2-노름을 계산 (O)
ans : 10
- L2-노름을 이용하여 두 벡터 사이의 거리를 계산 (O)
ans : 5
- 두 벡터 사이의 각도를 계산 (O)
ans : 0
- 두 벡터의 내적을 계산 (O)
ans : 16
[AI Math 2강 퀴즈] 행렬-1~5
- 전치행렬을 계산 (O)
ans : 2
- 두 행렬의 곱셈은 각 행렬의 모양과 상관없이 가능하다. (O)
ans : 아니오
- 어떠한 행렬의 역행렬은 항상 계산할 수 있다. (O)
ans : 아니오
- 역행렬을 계산 (O)
ans : 4
- 무어-펜로즈 역행렬을 계산 (O)
ans : 3
총평
지난주 피어 세션 시간에는 강의 내용 전체를 훑어보는 방식으로 진행했습니다.
반면에, 이번 주 피어 세션 시간에는 각자 강의와 관련된 내용을 준비하고 발표하는 방식으로 진행했습니다.
이렇게 진행하니, 책임감도 생기고 생각할 것도 많아져서 좋았습니다.
그리고 코드 리뷰도 피어 세션 시간에 진행했습니다.
지난주 과제가 쉬웠던지라 별거 없을 줄 알았는데, 예상과는 달리 배울 게 많아서 무척이나 재밌었습니다.
혼자서만 하던 것들을 다른 사람들과 함께하려고 하니 힘들었지만, 확실히 성장 속도는 후자가 빠르다고 느꼈습니다.
오늘보다 더 성장한 내일의 저를 기대하며, 내일 뵙도록 하겠습니다.
읽어주셔서 감사합니다!