728x90
numpy 라이브러리
- 머신러닝에서는 숫자, 사람, 동물 등의 인식하기 위해 이미지데이터를 행렬도 변환하는것이 중요함
- 행렬을 나타내기 위해 list를 사용할수도 있지만, 행렬연산을 위해 직관적이지도 않고 오류의 가능성이 높기때문에, 행렬연산을 위해 numpy사용이 필수다
0. 목차
- vector/ matrix 생성
- 행렬 사용법
- 행렬 곱(dot product)
- broadcast
- index / slice / iterator
- 전치행렬(transpose)
- concatenate
- useful function ( loadtxt(), rand(), argmax(), ..........)
1. vector/ matrix 생성
(1) vector
- vector는 np.array([....])를 사용하여 생성
shape
: shape의 경우 해당 객체의 (행,렬)을 알려줌ndim
: 차원을 알려줌(ex) 1차원, 2차원 ...)
출력
(2) matrix
matrix는 np.array([...], [...], [...], ...)를 사용하여 생성
reshape
: 내가 원하는 행렬로 다시 재구성 할수있음D = [1 2 3] D.reshape(3,2) [1 2] [4 5 6] ===> [3 4] [5 6] 2 * 3 행렬 3 * 2 행렬
출력
2. 행렬 사용법
(1) 행렬 곱 (dot product)
- A 행렬과 B 행렬의 행렬곱 (dot product)는 np.dot(A,B)로 나타내며, 행렬 A의 열벡터와 B행렬의 행벡터가 같아야한다.
- 만약 같지 않다면, reshape 또는 전치행렬(transpose)등을 사용하여 행 변환 한 후에 행렬곱을 실행하자
(2) broadcast
그렇다면 행렬 곱이 머신러닝에서 어떻게 쓰일까 ???
- 행렬 곱은 행렬의 원소 개수가 같아야만 계산할 수 있는 사칙연산의 한계를 벗어나 행렬곱 조건을 만족하는 다양한 크기의 행렬을 연속으로 만들고 행렬 곱을 연속으로 계산하면서 결과값을 만들 수 있기 때문에 머신러닝과 이미지프로세싱 분야에서 자주사용됨
- numpy에서는 크기가 다른 두 행렬간에도 사칙연산을 할 수 있는데 이를
broadcast
라고 지칭함broadcast
: 차원이 작은 쪽이 큰 쪽의 행 단위로 반복적으로 크기를 맞춘 후에 계산
아래의 예시는 A = 2 * 2 행렬, b = 스칼라값이다
- A + b를 할경우 차원이 낮은 b = 5가 차원이 큰 A의 행 단위로 크기를 맞춘뒤 계산을 해준다
- 그래서 b의 값을 모든 단위에 더해줘서 아래와 같이 출력된다.
위 과정이 broadcast
라고 지칭함
(3) 전치행렬(transpose)
- 전치행렬이란 어떤 행렬의 열은 행으로, 행은 열로 바꾼것으로서, 원본행렬이 A이라고 하면 전치행렬은 A^T로 나타냄
[1] matrix를 전치할경우
[2] vector를 전치할경우
- 우선 reshape을 통해 스칼라인 vector를 matrix로 변환
reshape 리뷰
: C 배열의 경우 [1,2,3,4,5]형태의 단순 vector구조임 ==> vector의 경우 matrix와의 연산을 위해 vector에서 matrix 바꿔야함 ==> C.reshape(1, 5)를 해여 1행 5열의 matrix형태로 바꿔줌
- 그 다음, 전치를 진행
C와 E의 출력값을 비교하면 reshape의 기능을 확실히 알수있다.
(4) 행렬의 indexing / slicing / iterator
[1] indexing / slicing
- 행렬 원소에서는 list처럼 indexing / slicing 모두 사용 가능함
- A[0, 0] => 1행 1열을 의미, A[2, 1] => 3행 2열을 의미
- A[0:-1, 1:2] => index가 0인 1행부터 index가 -1일땐 마지막 행을 의미함 근데 slicing할시 마지막 이전을 의미 하기 때문에 3행이 아닌 2행을 의미함 그리고 1:2의 경우 index가 1인 2열을 의미함
- 1행 2열과 2행 2열인 20,40을 출력
- A[:, 0] 에서 : 의 의미는 해당 행의 모든 행을 가져오자란 말, 그리고 index 가 0일땐 1열을 가져오자
- 해당 행렬은 3행 2열이니까 1행1열, 2행 1열, 3행 1열을 가져오자
[2] iterator
- 명시적(explicit) 인덱싱 / 슬라이싱 이외에, 행렬 모든 원소를 access 하는 경우에는 iterator 사용가능
- 행렬의 모든 원소를 접근할때 순서는 행단위부터 시작
- A행렬(2*4 행렬)의 경우 (0, 0) => (0, 1) => (0, 2) => (0, 3) => (1, 0) => (1, 1) => (1, 2) => (1, 3) 순서로 access(행단위부터 접근)
차후에 iterator를 이용하여 편미분 코드를 구현할예정이다
(5) concatenate
- 행렬에 행(row) 또는 열(columm) 추가하기 위한 numpy.concatenate
- 머신러닝의 회귀(regrssion) 코드 구현시 가중치와 bias를 별도로 구분하지 않고 하나의 행렬로 취급하기 위한 프로그래밍 구현 기술
- concatenate를 이용하여 기존의 행렬에서 행 or 열에 추가가 가능하다.
- B는 A에 새로운 행(아래)을 추가 (axis = 0)
- C는 A에 새로운 열(오른)을 추가 (axis = 1)
3. useful function
(1) loadtxt
- 파일 데이터를 읽고 행렬로 리턴하기때문에 인덱싱 or 슬라이싱으로 데이터를 분리 할 필요가 있음
- 머신러닝 코드에서 입력데이터와 정답데이터를 분리하는 프로그래밍 기법
(2) rand
- rand함수는 벡터나 행렬함수로 사용할 수 있으면 임의의 실수값을 랜덤하게 리턴해주는 함수
- rand함수는 가중치나 bias를 임의로 설정할때 자주 사용됨
- rand(3) ==> 스칼라값으로 출력
- rand(1, 3) ==> 1행 3열의 행렬 출력
- rand(3, 1) ==> 3행 1열의 행렬 출력
(3) sum, exp, log의 활용
- np.sum, np.exp, np.log
(4) max, min, argmax, argmin
- argmax는 최댓값이 있는 index를 리턴, 반면에 argmin는 최솟값이 있는 index를 리턴
axis = 0 일땐 열끼리 비교하고, axis = 1 일땐 행끼리 비교
np.max(X, axis=0) 의 경우 열끼리 비교하니까 (2,1,0), (4,2,5), (6,3,8) 을 비교
(5) ones, zeros
- numpy.ones, numpy.zeros는 해당 자리에 1 or 0을 채우는 함수
나만의 numpy 정리
numpy 라이브러리는 행렬의 기능을 효과적으로 사용하기 위해 무조건 사용해야하만하는 라이브러리
numpy를 통해 행렬의 생성, 수정, 연산 등등 다양한 기능을 수행할수 있다!!!!
728x90
'Data Science > 머신러닝' 카테고리의 다른 글
딥러닝 기초 나만의 정리 2 (0) | 2020.09.16 |
---|---|
딥러닝 기초 나만의 정리 (0) | 2020.07.08 |
LSTM으로 IMDB 리뷰 감성 분류하기 (0) | 2020.07.02 |
Logistic Regression(Classification) 나만의 정리 (0) | 2020.06.28 |
Linear Regression 나만의 정리 (2) | 2020.06.27 |
지도학습과 비지도학습 나만의 정리 (0) | 2020.06.26 |
수치미분 나만의 정리 (0) | 2020.06.26 |
matplotlib 라이브러리 (0) | 2020.06.25 |