np.meshgrid
·
[Library] - Numpy/API
이번 포스트에서는 격자형 그리드를 생성하는 방법에 대해 포스팅한다. 격자형 그리드란 공간에서 일정한 간격으로 포인트를 찍은 것을 말한다. 격자형 그리드를 통해 특정 데이터 공간을 명확하게 그릴 수 있다. 이를 테면 아래와 같이 그릴 수 있다. x = np.linspace(-3, 3, 7) # array([-3., -2., -1., 0., 1., 2., 3.])y = np.linspace(-2, 2, 5) # array([-2., -1., 0., 1., 2.])x, y = np.meshgrid(x, y)print(x.shape, y.shape)>>>(5, 7) (5, 7)x와 y를 일정한 간격으로 포인트를 찍는 함수인 np.linspace를 호출하여 구성했다. 주어진 x, y에 대하여 np...
PCA (Principal Component Analysis)
·
[Mathematics] - Linear Algebra
이론PCA는 고차원의 데이터의 분포를 유지한채(최대한 중요한 정보를 유지한채) 차원을 낮추기 위한 알고리즘이다. 고차원에서 저차원으로 변환하는 과정에는 초평면 혹은 벡터에 정사영 혹은 투영(projection) 과정이 수행된다. 우선, 고차원 데이터에 대한 데이터의 분포를 파악하는 것이 중요하다. 분포는 데이터가 어느정도 넓게 퍼져있는가를 의미한다. 만약 위와 같은 2차원 파란색 데이터가 존재한다고 가정할 때, 1~3번 선중 어느 선이 가장 데이터를 잘 표현한다고 할 수 있을까? 직관적으로 보았을 때, 데이터가 가장 넓게 분포한 방향으로 기울어진 2번 선을 선택할 수 있을 것이다. 2번 선(벡터)에 대해 사영시키면 빨간점으로 이루어진 데이터들을 볼 수 있다. 이 점들은 하나의 선(1차원)으로 표현..
Universal functions
·
[Library] - Numpy/Quick Start
이번 포스트에서는 universal function에 대해 알아볼 것이다. 넘파이에서는 np.sin, np.cos, np.exp와 같은 친숙한 수학적 함수들을 제공한다. 넘파이에서는 이러한 함수들을 universal function(범용 함수)이라고 부른다. 이러한 함수들은 피연산자 배열의 원소 단위로 연산이 수행되며, 결과를 새로운 행렬로 반환한다. B = np.arange(3)B>>>array([0, 1, 2])np.exp(B)>>>array([1. , 2.71828183, 7.3890561 ])np.sqrt(B)>>>array([0. , 1. , 1.41421356])C = np.array([2., -1., 4.])np.add(B, C)>>>array([2., ..
가상환경 패키지 목록 저장 및 불러오기
·
[ETC] - Python
이번 포스트에서는 pip와 conda 패키지 관리자를 통해서 가상환경에 저장되어 있는 패키지 목록을 파일로 내보내고(exort) 이를 설치하는 (import) 방법에 대해 알아보겠다. pip exportpip freeze > [파일명]pip 패키지 관리자를 통해 현재 활성화된 가상환경의 패키지 목록을 파일로 내보내는 역할을 한다. 예를 들어 pip freeze > requirements.txt 를 하면 requirements.txt 안에 설치된 패키지 목록이 쓰여있다. absl-py @ file:///opt/conda/conda-bld/absl-py_1639803114343/workaiohttp @ file:///C:/ci/aiohttp_1637857239634/workaiosignal @ file://..
Basic Operations
·
[Library] - Numpy/Quick Start
이번 포스트에서는 기본적인 넘파이 연산들에 대해 다뤄볼 것이다. a = np.array([20, 30, 40, 50])b = np.arange(4)c = a - b# 1 Operationprint(b)>>>array([0, 1, 2, 3])# 2 Operationprint(c)>>>array([20, 29, 38, 47])# 3 Operationprint(b**2)>>>array([0, 1, 4, 9])# 4 Operationprint(10 * np.sin(a))>>>array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])# 5 Operationprint(a >>array([ True, True, False, False])넘파이에서 산술 연산은 원소끼리..
Printing Arrays
·
[Library] - Numpy/Quick Start
이번 포스트에서는 넘파이 배열을 출력하고 읽는 방법에 대해 다뤄보려고 한다. 넘파이 배열의 차원이 높아질수록 읽기 어려워진다. 그러나 다음과 같은 읽는 방법을 따르면 문제가 없을 것이다.마지막 축은 왼쪽에서 오른쪽으로 출력된다.두 번째 ~ 마지막 배열들은 위에서 아래로 출력된다.1차원 배열은 가로로 출력된다.2차원 배열은 행렬로 출력된다.3차원 배열은 행렬의 리스트로 출력된다. # 1d arraya = np.arange(6)print(a)>>>[0 1 2 3 4 5]# 2d arrayb = np.arange(12).reshape(4, 3)print(b)>>>[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]# 3d arrayc = np.arange(24).reshape(2,..
CUDA, cuDNN 설치 및 tensorflow-gpu 환경 세팅
·
[ETC] - Python
이번 포스트는 tensorflow에서 GPU를 세팅하는 방법에 대해 작성한다. 물론 여기보다 더 잘 설명된 글도 많지만 굳이 다시 찾아보지 않으려고 작성한다. 무튼, 엔비디아 그래픽 카드(RTX 3060 TI)를 기준으로 글을 작성한다. 그리고 가상환경을 기준으로 세팅할 것이기 때문에 가상환경에 대해 모르는 분은 해당 포스트를 참고하면 도움이 된다. 엔비디아 그래픽 드라이버 설치구글에 돌아다니는 글들을 보면 흔히 무작정 CUDA 부터 설치하는 경우가 많은데, 이전에 해야 몇 가지 작업이 있다. (기존에 엔비디아 그래픽 드라이버가 설치되어 있는 분이라면 이 단계는 뛰어넘어도 된다.) 엔비디아 그래픽 드라이버가 설치부터 하자. 이 과정을 수행하지 않으면, 인텔 CPU를 사용한다면, 내장 그래픽으로 모니터를 ..
Python 가상환경 세팅 (feat. Anaconda)
·
[ETC] - Python
Anaconda 설치가장 먼저 해야할 것은 Anaconda를 설치하는 것이다. Anaconda를 통해 우리는 가상환경을 구축할 수 있다. 굳이 가상환경을 사용하는 이유에 대해 간단히 언급하자면, 상황별로 사용해야 하는 모듈들 혹은 버전이 상이할 것이다. 이를 위해 용도별로 적합한 가상환경을 구축한다. https://www.anaconda.com/ Anaconda | The World's Most Popular Data Science PlatformAnaconda is the birthplace of Python data science. We are a movement of data scientists, data-driven enterprises, and open source communities.www...
np.random
·
[Library] - Numpy/API
이번 포스트에서는 numpy 패키지중 랜덤으로 배열을 생성하는 메소드들에 대해 알아볼 것이다. np.random.rand이 메소드의 인자는 정수들을 여러개 나열할 수 있다. (가변인자) 이 정수들은 생성될 배열의 차원이 된다. 각 요소들은 균일분포에서 0~1 사이의 값들로 이루어져 있다.import numpy as npr = np.random.rand(4, 3, 3)print(r.shape)print(r)>>(4, 3, 3)[[[0.24380173 0.55585745 0.68894391] [0.73212786 0.32187644 0.6370955 ] [0.19283783 0.32313824 0.54533787]] [[0.10738025 0.06398702 0.82363365] [0.29439519 ..
SVD (Singular Value Decomposition)
·
[Mathematics] - Linear Algebra
사전 지식직교행렬 (othogonal matrix)직교행렬은 각 열벡터가 서로 직교하는 행렬을 의미하며, 각 열벡터의 스칼라값이 1일 경우, 해당 행렬은 정규직교행렬이라고 한다. 대각행렬 (diagonal matrix)대각행렬은 주대각선 요소에만 값이 존재하는 행렬을 의미한다. 그러므로 대각행렬에 대한 전치행렬(transpose matrix)은 결국 자기 자신이다. 고유값 분해 (eigen value decomposition)1편, 2편 SVD (Singular Value Decomposition) SVD의 정의는 특정 벡터들이 서로 직교할 때, 해당 벡터들에 선형변환 $A_{m \times n}$를 취한 경우, 선형변환된 벡터들이 크기는 변하더라도 여전히 직교하는가? 의 의미를 지니고 있다. 행..
Numpy Array Creation
·
[Library] - Numpy/Quick Start
지난 포스트에서는 Numpy에 대해 기본적인 내용들을 살펴보았다. 이번 포스트에서는 Numpy 배열을 생성하는 방법들에 대해 알아보려고 한다. Basic creationimport numpy as npa = np.array([1, 2, 3, 4])print(a)print(a.dtype)print(a.shape)>>[1 2 3 4]int64(4,)기본적인 배열 생성 방법은 np.array 메소드에 인자로 배열의 요소로 들어갈 시퀀스를 전달하는 방법이다. b = np.array([(1.5, 2, 3), (4, 5, 6)])print(b)print(b.dtype)print(b.shape)>>[[1.5 2. 3. ] [4. 5. 6. ]]float64(2, 3)다차원 배열을 생성할 때는 시퀀스를 변형하..
Numpy 기초
·
[Library] - Numpy/Quick Start
Numpy 라이브러리 설치우선, 자신의 개발환경에 Numpy 라이브러리가 설치되어 있는지부터 확인하는 명령어는 아래와 같다.pip list 파이썬에 관련되어 설치된 패키지 목록이 출력된다. 그중에서 Numpy가 설치되어 있으면 그냥 넘어가도 되지만, 안되어 있으면 아래와 같은 명령어를 입력한다.pip install numpy 추가로 Matplotlib 라이브러리가 설치되어 있지 않다면 아래의 명령어도 입력해주자. Matplotlib 라이브러리는 시각화를 위한 라이브러리다. Numpy 라이브러리를 통해 얻은 값 혹은 배열을 시각화하는데 도움이 된다. pip install matplotlib Numpy ArrayNumpy 라이브러리는 선형대수를 다루기에 적합한 도구이다. Numpy 라이브러리는 Numpy A..
Long Short-Term Memory (LSTM) - Code
·
[AI] - Neural Network
지난 포스트에서는 LSTM의 이론에 대해 다루었다. 이번 포스트에서는 LSTM을 코드로 구현해보는데 주의해야할 점이 있다. 기존의 RNN을 구현할 때에는 은닉 상태에 해당하는 변수 hidden 하나만 다음 시퀀스의 메모리 셀로 전달하는 구조였다. 하지만, LSTM은 은닉 상태 이외에도 셀의 상태에 해당하는 변수인 cell도 같이 고려해야 한다. Pytorch를 통한 구현"""두 번째 단어를 입력으로 세 번째 단어가 무엇이 나올지 예측"""import numpy as npimport torchimport torch.nn as nnimport torch.optim as optimsentences = ['i like dog', 'i love coffee', 'i ha..
군집화 평가 지표 (실루엣 계수, 응집도)
·
[AI] - Machine Learning
이번 포스트에서는 저번 포스트에서 다루었던 군집화 알고리즘이 잘 수행되었는지 판단하기 위한 지표에 대해 알아본다. 이번에 알아볼 지표로는 두 가지로 실루엣 계수와 응집도가 있다. 실루엣 계수 (silhouette score) 실루엣 계수는 각각의 데이터가 해당 데이터와 같은 군집 내의 데이터와는 얼마나 가깝게 군집화가 되었고, 다른 군집에 있는 데이터와는 얼마나 멀리 분포되어 있는지를 나타내는 지표이다. 실루엣 계수가 가질 수 있는 값은 -1~1이며, 1에 가까울수록 군집화가 잘 되었음을 의미한다. 하지만, 데이터 하나에 대한 실루엣 계수만 좋다고 군집화가 잘 이루어졌다고 일반화를 할 수 없다. 각 군집별 데이터의 수가 고르게 분포되어야 하며, 각 군집별 실루엣 계수 평균값이 전체 실루엣 계수 평균값에 ..
군집화 알고리즘 (K-Means Clustering)
·
[AI] - Machine Learning
이번 포스트에서는 저번 포스트에서 다루었던 군집화 알고리즘 중 대표적인 방법인 K-Means Clustering에 대해 알아보겠다. K-Means Clustering 알고리즘은 이름에서 알 수 있다시피 K개의 군집을 정하며, 데이터들의 평균 중심(거리의 평균)을 각 군집의 중심점으로 삼는다. STEP 1 : 군집의 갯수만큼 임의의 위치에 중심점을 정한다.STEP 2 : 각 데이터를 가장 가까운 중심점에 해당하는 군집에 소속시킨다.STEP 3 : 각 군집에 속해있는 데이터들의 평균 거리를 갖는 중심위치로 군집의 중심점을 이동시킨다. STEP 2~3의 과정을 반복하고, 중심점의 위치에 변화가 없을 경우 군집화 과정을 멈춘다. 알고리즘 자체는 단순하지만, 피처 수가 많아지면 기하급수적으로 느려지는 현상이 있..
Long Short-Term Memory (LSTM) - Theory
·
[AI] - Neural Network
지난 포스트에서는 순환 신경망 (RNN)에 대해 다루었다. RNN은 시퀀스 데이터를 처리하기에 적합하지만, Gradient vanishing 현상이 존재한다. Gradient vanishing은 신경망에서 은닉층을 거칠수록 (역전파를 통해 가중치를 편미분한) 기울기가 소실되어 학습이 느려지는 현상을 말한다. RNN에서 Gradient vanishing을 직관적으로 설명하면 문장이 길어질수록 앞의 내용을 잊어버리고 뒤에서 엉뚱한 추론을 한다는 의미이다. (역전파와 Gradient vanishing에 관련된 내용은 추후에 포스트에서 자세하게 다루겠다.)RNN의 Gradient vanishing 문제를 보완하기 위해 메모리 셀에 단순히 은닉 상태(hidden state)뿐만이 아닌 셀 상태(cell state..
Recurrent Neural Network (RNN) - Code
·
[AI] - Neural Network
이번 포스트에서는 지난 포스트에서 다루었던 RNN의 이론을 바탕으로 코드로 직접 구현해본다. RNN의 은닉층 연산에 대해 간단히 복습을 해보자. $h_{t} = tanh(W_{x}x_{t} + W_{h}h_{t-1} + b)$ 위 식은 이전 메모리 셀의 은닉 상태($h_{t-1}$)와 현재 시퀀스의 입력 데이터($x_{t}$)를 바탕으로 현재 메모리 셀의 은닉 상태를 연산하는 식을 의미한다. $D_{h}$ : 은닉층의 크기$d$ : 입력 벡터의 크기 (피처 수, 단어의 종류 수) Numpy를 통한 구현import numpy as np# sequence data : N x T x D (샘플 수 x 시퀀스 수 x 차원 수)time_steps = 10 # T (시퀀스 수)input_dim = 4 # ..
Recurrent Neural Network (RNN) - Theory
·
[AI] - Neural Network
Sequence Data (시퀀스 데이터)이번 포스트에서는 순환 신경망(Recurrent Nerual Network, RNN)에 대해 다룬다. RNN은 입출력을 시퀀스(=시간) 단위로 처리하는 모델이다. 고로, 시계열 데이터를 처리하는데에 적합하다. RNN을 다루기 이전에 시퀀스에 대해 간략하게 짚고 넘어가자. 이전에 다루던 데이터는 시간을 고려하지 않은 데이터들이었다. Tabular 데이터는 $N \times D$의 모양을 가지고 있다. 이때, $N$은 데이터 샘플의 수, $D$는 피처의 수다. 여기에 시간을 고려한 데이터를 하나의 배열에 표현하려면 $N \times T \times D$로 표현할 수 있다. 그리고 RNN의 각 시퀀스의 입력에 대입되는 모양은 $N \times 1 \times D$가 ..
군집화 알고리즘 (Clustering Algorithm)
·
[AI] - Machine Learning
이번 포스트에서는 비지도 학습 방법 중 군집화에 대해 알아보고, 군집화 알고리즘 유형에 대해 알아보겠다. 그렇다면 군집화는 무엇을 의미할까? 군집화는 다른 그룹보다 특성이 비슷한 데이터들끼리 그루핑하는 것을 의미한다. 예를 들어, 이 글을 읽는 독자가 사장이라고 가정해보자. 사장이 고객의 등급에 따른 새로운 비즈니스 전략을 세우려고 한다. (예를 들면, VVIP, VIP, 일반) 이 때, RFM (Recency, Frequency, Monetary) 분석을 통해 고객의 등급(=군집)을 분류할 수 있다. Recency : 고객이 얼마나 최근에 구매하였는가?Frequency : 고객이 얼마나 자주 구매하였는가?Monetary : 고객이 얼마나 많이(크게) 구매하였는가?즉, 이 세 가지 특성을 통해 클러스터..
선형 분류 (Linear Classification)
·
[AI] - Machine Learning
지난 포스트에서 선형 분류에 대해 자세히 다루지 못한것 같아 이번에 좀 자세히 다루려고 한다. 복습을 간단하게 하자면, 지도 학습에는 크게 분류와 회귀 문제가 존재한다. 그리고 회귀 문제는 데이터들을 가장 잘 나타내는 선을 찾는 것이 목적이다. 분류 문제도 회귀 문제와 메커니즘은 비슷하지만, 찾고자 하는 선의 목적이 다르다. 분류는 데이터들을 가장 잘 분류하는 선을 찾는 것이 목적이다. 즉, 회귀의 선은 데이터들 사이의 거리가 가까운 선을 찾으려고 하지만, 분류는 (클래스별로)거리가 먼 것을 찾으려고 하는 것이다. 사실 위의 그림을 이해를 위해 선으로 표현했지만, 선형 분류의 의미를 엄밀히 말하면 데이터를 잘 분류할 수 있는 초평면(hyperplane)을 찾는 것이라고 해야 정확한 의미이다. 이번 포..