[U] Week 2 Day 6

나며기·2021년 1월 25일
0

부스트캠프 AI Tech

목록 보기
7/79
post-thumbnail

강의 복습 내용

[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강] 행렬이 뭐에요?

코드 리뷰

  1. 공백 문자
str.strip() = ""
  1. 반복문과 조건문 밖에 미리 선언
result = None # 만일의 사태에 대비하여, 미리 선언
for i in range(10):
	if i == 1:
    	result = i
result = user_input.lower() in ["h","help"]
  1. 정규 표현식이 시간 복잡도가 작다.
  2. 주석 < 가독성 좋은 코드
  3. else 지양
  4. 반복문 이전에 미리 호출하는 것이 좋다.
  5. main의 wrong_input 부분만 while을 해주는 것이 좋다.
  6. for문의 in 뒤쪽은 한 번만 호출 (따라서, 미리 선언할 필요가 없음)
{j:i for i,j in dictionary.items()} = dict(map(reversed,dictionary.items()))
  1. list보다 set이 빠르다.
  2. 과제에서 mock 모듈로 자체적으로 테스트할 수 있다.
  3. 1line = 79char
  4. 리스트 컴프리헨션에서 중첩은 지양

[Team JKW] 카카오 아레나

퀴즈 결과 회고

[AI Math 1강 퀴즈] 벡터-1~5

  1. 벡터의 L1-노름을 계산 (O)

ans : 6

  1. 벡터의 L2-노름을 계산 (O)

ans : 10

  1. L2-노름을 이용하여 두 벡터 사이의 거리를 계산 (O)

ans : 5

  1. 두 벡터 사이의 각도를 계산 (O)

ans : 0

  1. 두 벡터의 내적을 계산 (O)

ans : 16

[AI Math 2강 퀴즈] 행렬-1~5

  1. 전치행렬을 계산 (O)

ans : 2

  1. 두 행렬의 곱셈은 각 행렬의 모양과 상관없이 가능하다. (O)

ans : 아니오

  1. 어떠한 행렬의 역행렬은 항상 계산할 수 있다. (O)

ans : 아니오

  1. 역행렬을 계산 (O)

ans : 4

  1. 무어-펜로즈 역행렬을 계산 (O)

ans : 3

총평

지난주 피어 세션 시간에는 강의 내용 전체를 훑어보는 방식으로 진행했습니다.
반면에, 이번 주 피어 세션 시간에는 각자 강의와 관련된 내용을 준비하고 발표하는 방식으로 진행했습니다.
이렇게 진행하니, 책임감도 생기고 생각할 것도 많아져서 좋았습니다.

그리고 코드 리뷰도 피어 세션 시간에 진행했습니다.
지난주 과제가 쉬웠던지라 별거 없을 줄 알았는데, 예상과는 달리 배울 게 많아서 무척이나 재밌었습니다.

혼자서만 하던 것들을 다른 사람들과 함께하려고 하니 힘들었지만, 확실히 성장 속도는 후자가 빠르다고 느꼈습니다.

오늘보다 더 성장한 내일의 저를 기대하며, 내일 뵙도록 하겠습니다.

읽어주셔서 감사합니다!

profile
PLUS ULTRA

0개의 댓글