단방향 연결 리스트 (Single Linked List)
·
[CS] - Data Structure
지난 포스트에서는 데크에 대해서 다루었다. 데크의 직접 구현 부분에서는 연결 리스트를 사용하여 구현했다. 그래서 실은 순서가 뒤집히지 않았나 싶지만.. collections 라이브러를 통해서도 데크를 사용할 수 있기에 이번 포스트를 읽고 지난 포스트를 다시 보기를 권장한다. 각설하고, 이번 포스트에서는 연결 리스트에 대해서 다루겠다. 연결리스트의 키워드를 세 가지 뽑으라면 필자는 이렇게 말할 것이다. 노드, 삽입, 수정 리스트나 스택, 큐에서는 보관하고 있는 데이터가 raw data (원시 데이터 - 이를테면, 정수형) 였다. 하지만, 연결 리스트에 사용되는 데이터의 (클래스) 타입은 Node 이다. 왜 굳이 클래스를 사용하는가? 그것은 단순히 원시 데이터 이외에도 다음 노드를 가르킬 포인터(next)..
데크 (Deque)
·
[CS] - Data Structure
저번 포스트에서는 나서스의 스택에 스택과 큐에 대해 알아보았다. 이번 포스트에서는 큐의 연장선상 개념(?)인 데크에 대해서 알아보겠다. 데크는 풀네임 영어로 Double Ended Queue를 의미한다. 즉, 양방향으로 끝이 존재하는 큐를 뜻한다. 이번에도 역시 그림을 그려보자. 큐와 모양 자체는 똑같다! 하지만, 큐는 한뱡으로 들어가고 나갈 수 없는 방면에 데크는 양끝에 데이터가 들어오고 나갈 수 있는 특징이 있다. 그렇다면 데크를 왜 사용하는지 알아보자. 이는 파이썬의 리스트 자료형과 비교하면 알 수 있다. 우리가 리스트에 insert하는 과정을 그림으로 그리면 다음과 같다. 먼저 insert를 하기 위한 공간 하나를 할당해주어야 한다. 그 다음 기존에 존재하던 자료의 갯수(N개, 위 그림에서는 ..
스택과 큐 (Stack and Queue)
·
[CS] - Data Structure
스택과 큐라고 하면 무엇이 떠오르는가? 지금은.. 나서스의 스택을 안떠올렸으면 좋겠다. (스택의 의미가 아닌것은 아니지만..) 이 포스트를 통해 스택의 개념을 익히면 나서스가 왜 스택을 쌓는다고 표현할지 알것이다. 우선 직관적으로 접근하기 위해서는 그림을 그려보자. 스택과 큐를 유리컵에 비유하자면, 스택은 바닥이 막혀있는 유리컵이고 큐는 바닥이 뚫려있는 유리컵이다. 그리고 우리가 물건을 넣은 모습은 다음과 같다. 둘다 물건을 위에서 집어넣었다고 생각해보자. 그럼 물건을 어떻게 꺼낼까? 스택은 마지막에 넣은 물건을 먼저 꺼내야하고, 큐는 가장 처음에 넣었던 물건을 먼저 꺼낼 수 있다. [정리]스택은 선입후출(FILO: First In Last Out, 먼저 들어온게 마지막에 나감)큐는 선입선출(F..
회귀 알고리즘 (Ridge, Lasso, ElasticNet)
·
[AI] - Machine Learning
이번 포스트에서는 선형 회귀 이외의 다른 회귀 알고리즘에 대해 다뤄본다.결론부터 이야기하면 다음과 같다. Lasso = Linear Regression + L1 RegularizationRidge = Linear Regression + L2 RegularizationElasticNet = Linear Regression + L1 Regularization + L2 Regularization 우리는 학습을 하다보면 점점 Loss가 떨어지는 것을 확인할 수 있다. 하지만, 거기서 안심하면 안된다. 오버피팅(과적합)은 머신러닝 분야에서 항상 존재하는 이슈이다. 오버피팅을 방지하기 위한 기법은 여러가지가 존재한다. Dropout, Batch normalization, RandomCrop 등.. 여러가지 존재한..
선형성, 비선형성 (Linear, Non-linear)
·
[AI] - Machine Learning
이번 포스트에서는 선형, 비선형의 정의에 대해서 자세하게 짚고 넘어가려고 한다. 이 포스트를 작성하는 이유는 "선형" 이라는 단어에 대해 혼동되지 않기 위해서 남긴다. 처음으로 의문이 든 것은 다음 이미지에서 시작되었다. 이전 포스트에서 우리는 선형 회귀에 대한 내용을 다루었다. 위 이미지는 우리가 찾고자하는 선의 기울기와 절편을 얻기 위해 과도하게 update를 계속 진행하면 오버피팅이 발생한다는 의미를 나타낸다. 그런데, 보통 머신러닝을 배우다보면 선형을 기하학적으로 선의 모양을 유지하면 선형 (혹은 꾸불거리지 않거나)이라고 정의하는 것에서 모순을 느꼈다. 그렇다면, 오른쪽 그림은 꾸불거리면 더 이상 선형이 아니지 않은가? 왜 선형 회귀의 오버피팅이지? 라는 의문이 들었다. 답은 아래의 사이트에서..
고유값 분해 (Eigen-value Decomposition) - 2
·
[Mathematics] - Linear Algebra
저번 포스트에서는 고유값과 고유벡터에 대해서 알아보았다. 이번 포스트에서는 실제로 행렬 A에 대해 고유값 분해를 하는 과정에 대해 알아보겠다. 우선, $n \times n$ 행렬 A에 대해 고유값과 그에 대응하는 고유벡터들을 구해야한다. 그리고 고유벡터들($v_i$)을 모아둔 행렬 $V$를 다음과 같이 정의할 수 있다. 두 번째 식에 각각의 열벡터(고유벡터)에 해당하는 고유값을 곱해보자. 그 결과 행렬 A와 V로 위와 같이 표현할 수 있다. 마지막으로 고유값들을 대각성분에 모아둔 행렬을 보자. 네 번째 식을 통해 AV 행렬을 인수분해가 가능하다. 다섯번째 식에서 각 열벡터(행렬 V의 고유벡터)들이 선형독립이라면 아래와 같이 행렬 A를 표현할 수 있다. 사실 아직 행렬 A를 분해하는 의미를 설명하..
고유값 분해 (Eigen-value Decomposition) - 1
·
[Mathematics] - Linear Algebra
고유값 분해를 다루기 이전에 고유값과 고유벡터의 개념에 대해서 먼저 다루려고 한다. 먼저 이 포스트를 보기 이전에 선형변환에 대한 개념을 숙지하고 보는 것을 추천한다. 우리는 선형변환을 하나의 함수로써 생각했다. 예를 들어 임의의 벡터 x를 행렬 A의 선형변환 연산을 취했을 경우, 또 다른 벡터가 나오는 것처럼.. 보통은 선형변환을 통해 크기와 방향 모두 바뀐다. 하지만, 우리가 이번에 다룰 선형변환은 크기만 바뀌는 경우에 대해서만이다. 그렇다면, 고유값과 고유벡터는 어떤 의미를 지닐까? 고유값은 방향이 변하지 않은 벡터에 대해 어느정도 크기가 바뀌었는가의 의미이고, 고유벡터는 해당 고유값에 대응하는 벡터 x를 의미한다. 수학적으로는 다음과 같이 정의할 수 있다. 위 식을 이항하면 다음과 같이 표현..
데코레이터 (Decorator)
·
[Language] - Python
개요데코레이터를 이해하기 이전에 함수형 프로그래밍에 대한 (함수를 일급시민으로 취급하는) 개념을 먼저 살피고 오면 좋다. 데코레이터는 사전적으로 장식자라는 의미를 가지고 있으며, 장식의 대상이 되는 함수를 데코레이터 함수의 인자로 전달하여 내부적으로 실행방식을 래핑(Wrap)한다. 데코레이터 사용법은 대상이 되는 함수 위에 @데코레이터명 을 쓰면 된다. 예를 들면, @staticmethod, @classmethod, @property 등 다양한 데코레이터들이 있고, 사용자가 임의로 데코레이터를 정의할 수도 있다. 클로저 (Closure)def closure(msg): def wrapper(): print(msg) return wrapperfunc = closure("Hello,..
선형 분류와 선형 회귀 (Linear Classification & Linear Regression)
·
[AI] - Machine Learning
이번 포스트에서는 선형 분류와 선형 회귀에 대해 다뤄본다. 본 내용을 이전에 지도 학습(Supervised Learning)에 대해 간단하게 다루고 넘어가겠다. 지도 학습은 입력 데이터와 정답 데이터가 같이 주어져 학습하는 방식을 의미한다. 즉, 학습할 때 입력 데이터를 통해 머신러닝 모델이 예측한 데이터와 정답 데이터를 비교하면서 생기는 오차(Residual)를 보정해나가는 것을 의미한다. 근데 왜 갑자기 지도 학습에 대해 언급을 했을까? 그것은 지도 학습의 대표적으로 분류(Classification) 문제와 회귀(Regression) 문제가 있기 때문이다.분류와 회귀는 둘다 예측 알고리즘이다. 그러나 무엇을 예측하는지가 다르다. 분류는 이산적인 값을 예측하는데에, 회귀는 연속적인 값을 예측하는데에 사..
GBM (Gradient Boosting Machine)
·
[AI] - Machine Learning
부스팅 알고리즘에는 대표적으로 AdaBoost와 GBM 방식이 있다. AdaBoost는 여러 개의 week learner를 순차적으로 학습하면서 틀린 데이터에 가중치를 부여하여 뒤에 있는 week learner가 분류하여 모든 분류 결과들을 취합하는 것을 의미한다. 반면, GBM은 여러 개의 week learner를 순차적으로 학습하면서 앞에 있는 week learner가 틀린 데이터에 가중치를 부여하여 오류를 개선하는 방향으로 학습하는 방식이지만 AdaBoost와의 차이점은 Gradient를 사용한다는 것이다. 딥러닝에 관심이 있다면 경사하강법 (Gradient Descent)에 대해 한번쯤은 들어봤을 것이다. 경사하강법에 대해 간략하게 설명하면, 실제 정답과 예측 정답 사이의 오차가 존재할 것이다..
앙상블 기법 (Ensemble)
·
[AI] - Machine Learning
지난 포스트에서는 의사 결정 나무에 대해서 다루었다. 의사 결정 나무는 단 하나의 분류기를 사용하지만, 이번 포스트에서는 여러 분류기들을 결합한 방법인 앙상블 기법에 대해 다룰 것이다. 마치 오케스트라처럼 여러 악기가 모여 화음을 이루듯, 여러 분류기들을 결합하는 것이다. P.S) 이미지, 영상, 음성과 같은 비정형 데이터의 분류는 딥러닝이, 정형 데이터에서는 앙상블이 좋은 성능을 낸다. 우선 앙상블의 조합 기법 4가지를 간단하게 살펴볼 것이다. 1. Voting 기법특징 1 : 서로 다른 알고리즘 결합특징 2 : 전체 데이터 셋을 알고리즘 사이에서 공유 2. Bagging 기법특징 1 : 같은 알고리즘 결합특징 2 : 전체 데이터 셋에 대하여 Bootstraping sampling (복원 추출)을 통해..
의사 결정 나무 (Decision Tree)
·
[AI] - Machine Learning
의사 결정 나무에 대한 내용을 다루기 이전에 지금까지 정리했던 내용을 큰 맥락으로 한번 짚고 넘어갈까 한다. 1. 전처리 1.1 encoding from sklearn.preprocessing import LabelEncoderfrom skelarn.preprocessing import OneHotEncoder 1.2 feature scalingfrom sklearn.preprocessing import StandardScalerfrom sklearn.preprocessing improt MinMaxScaler 1.3 학습 데이터 분리 & 교차검증 from sklearn.model_selection import train_test_splitfrom sklearn.model_selection import ..
F1 스코어와 ROC 커브
·
[AI] - Machine Learning
저번 포스트에 이어 이번에는 재현율과 정밀도를 기반으로 하는 F1 스코어와 오차행렬을 기반으로 한 ROC 커브에 대해서 알아본다. F1 스코어는 재현율과 정밀도의 조화 평균을 의미한다. 산술, 기하, 조화 평균에 대한 자세한 내용은 다음 블로그에서 참조했다. 기억해야할 것은 재현율(recall)과 정밀도(precision)은 트레이드 오프 관계이다.recall = 0.9, precision = 0.1 인 경우 F1 = 2 * 0.9 * 0.1 / 1.0 = 0.18recall = 0.5, precision = 0.5 인 경우 F1 = 2 * 0.5 * 0.5 / 1.0 = 0.5 모델의 성능은 재현율과 정밀도의 균형도 중요하므로 F1 스코어가 높은 것이 유리하다. F1 스코어를 확인하는 방법은 다음과 ..
정확도와 오차행렬 (Accuracy and Confusion matrix)
·
[AI] - Machine Learning
이번 포스트에서는 모델의 성능을 평가하기 위한 지표에 대해서 알아볼 것이다. 그중에서 가장 직관적인 방법인 정확도와 정확도의 한계점을 보완하기 위한 오차행렬에 대해서 알아본다. 정확도는 실제 데이터와 예측 데이터가 얼마나 같은지를 판단하는 지표이다. 정확도의 공식은 다음과 같다. 정확도는 쉽고 직관적이지만, 불균형한 데이터 세트에서는 적절하지 않다. 예시를 들자면, 100개의 데이터중 True가 90개, False가 10개가 있다고 가정하자. 이러한 경우 무조건 결과를 True로 반환하는 경우 정확도는 90%가 된다. 정확도가 가지는 한계점을 극복하기 위해 여러가지 분류 지표를 적용해야 한다. 앞에서 언급한 여러가지 분류 지표의 기반이 되는 개념은 오차행렬에 대해서 알아보겠다. 오차행렬을 도식화하면 다음..
QR 분해 (QR Decomposition) - 2
·
[Mathematics] - Linear Algebra
저번 포스트에 이어 직교 행렬과 실제로 QR 분해 활용에 대해 알아봅니다. 결론부터 얘기하면 직교 행렬은 곧 직교 좌표계를 의미한다. 행렬의 각 열벡터가 직교할 경우 해당 행렬은 직교 좌표계를 의미한다. 정규직교행렬은 각 열벡터를 정규화함으로써 각 열벡터의 크기가 1인 행렬을 의미한다. 즉, 정규직교행렬은 서로 직교하는 크기가 1인 기저벡터들의 집합이라고 정의할 수 있겠다. 선형 시스템의 A는 좌표계를 의미한다. 해당 A 행렬이 직교 행렬일 경우 역행렬을 통해 해를 구할 필요가 없다. 위의 투영 벡터 공식을 보면 알 수 있다. 벡터 u를 벡터 a에 투영했을 때는 기저 a에 대한 좌표값이다. 즉, 벡터 a를 얼마나 스칼라배를 해야하는지를 의미(기저 a에 대한 좌표)하는 것이다.위 개념을 예시에 적용하면, ..
QR 분해 (QR Decomposition) - 1
·
[Mathematics] - Linear Algebra
QR 분해의 내용은 두 포스팅에 걸쳐서 진행하겠습니다. QR 분해는 정방 행렬($A_{m \times m}$)을 분해하는 방법 중 하나로 투영(projection)을 기반으로 하는 알고리즘인 그람 슈미트 과정(Gram-Schmidt Process)로 진행한다. 고로 투영을 이해하기 위해 기본적으로 벡터의 정의부터 파악하려고 한다. 벡터를 물리적으로 정의하면 방향과 스칼라의 조합이다. 벡터 v의 방향은 화살표의 방향, 크기(스칼라 형태)는 화살표의 길이를 의미한다. 벡터의 수학적인 정의는 수들의 집합이며 각 수들은 각 축에 대한 좌표값이다. 예를 들어, 벡터 v = (1, 2, 3) 이리면 원점으로부터 x축으로는 1, y축으로는 2, z축으로는 3의 지점을 향하는 화살표이다. 수들의 갯수가 늘어날수록 차원..
선형 변환 (Linear Transform)
·
[Mathematics] - Linear Algebra
이론함수는 정의역(Domain)과 공역(Codomain)간의 1대 1 mapping 관계를 의미한다. 함수는 크게 선형함수와 비선형함수로 분류할 수 있다. 선형함수는 말그대로 기하학적으로 Linear한 형태의 함수를 의미한다. 선형함수에 해당하기 위한 조건은 다음과 같이 2가지가 있다. 이제 함수에 대해 간단하게 짚었으니, 변환(transformation)에 대해 알아볼 차례이다. 변환은 입출력이 벡터인 함수를 의미한다. 특히, 입력 벡터와 출력 벡터의 차원이 동일한 경우 ($n$-벡터와 $m$-벡터에 대해 $n=m$인 경우) 변환이라 칭하지 않고 연산자(operator)라고 한다. 선형시스템에서 행렬 A는 ($m \times n$ 행렬) $n$-벡터를 입력으로 받아 $m$-벡터를 출력으로 하는 변환(..
좌표계 변환 (Change of Basis)
·
[Mathematics] - Linear Algebra
이론이번 포스팅에서는 직교 좌표계 변환에 대해 알아볼 것이다. 흔히 우리가 학생때 서로 수직인 X, Y 축을 통해 좌표를 표현하는 것은 직교 좌표계 (orthogonal coordinate system)이라고 한다. 그 밖에도 다른 좌표계에 대한 설명이 궁금하면 해당 링크를 참고하면 된다. 우선 앞에서 다루었던 선형 시스템의 공식을 되짚어보면 Ax = b 의 형태를 지닌다. 우리는 해당 선형시스템으로부터 A를 좌표계로, x를 해당 좌표계에 속한 특정 좌표값으로 해석하고 변환하는 것이 이번 포스팅의 목표이다. 좌표계 변환을 배우기 이전에 벡터에 대해 간단하게 짚고 넘어가자. 벡터의 물리적 표현과 수학적 표현에 대해서 알아볼 것이다. 물리적 표현벡터는 방향과 크기(스칼라)를 동시에 지닌 개념으로 물리적으로는..
[Utils] QCheckBoxUtils
·
[Framework] - PyQT
from PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QWidgetfrom PyQt5.QtWidgets import QHBoxLayoutfrom PyQt5.QtWidgets import QCheckBoxclass QCheckBoxUtils: @staticmethod def check_box_aligned_center(): widget = QWidget() layout = QHBoxLayout() check_box = QCheckBox() layout.setAlignment(Qt.AlignCenter) layout.addWidget(check_box) widget.setLayo..
싱글턴 패턴 응용
·
[CS] - Design Pattern
이번 포스트는 파이썬으로 작성한점 양해 부탁드립니다.아래의 포스트를 읽고 오는 것을 권장한다.https://dev-ryuon.tistory.com/53" data-og-host="dev-ryuon.tistory.com" data-og-source-url="https://dev-ryuon.tistory.com/53" data-og-image="https://blog.kakaocdn.net/dna/GlOxB/hyK7uIixdH/AAAAAAAAAAAAAAAAAAAAAPdDmZ3q6EHTA9GiBf-2RQ-1nOe1MlNsfMJTcAJaCNr2/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1767193199&allow_ip=&allow_referer=&signature=3vtP70KBpL0ZFuyOcHQvsNloXNk%3D data-og-url="https://dev-ryuon.tistory.com/53"> # 17. __new__() 와 __init__()파이썬을 다루면서 클래스..