Python 객체의 생명 주기와 메모리
·
[Language] - Python
개요어떤 언어든 마찬가지이지만, 비즈니스 로직을 구현할 때 메모리 관리에 신경 쓰지 않으면 메모리 누수(Memory Leak) 현상이 발생할 수 있다. 이는 시스템 성능 저하로 이어질 수 있으며, 특히 규모가 커질수록 바늘 찾기(needle in haystack)처럼 문제의 원인을 찾기 어려워질 수 있다. 따라서 초기 단계부터 단위 테스트와 함께 메모리 관리에 신경 써야 할 부분이기도 하다.C 언어는 malloc(), free()로 메모리를 직접 관리해야 하지만, Python은 Java처럼 가비지 컬렉터(GC)가 객체의 메모리를 자동으로 수거해주기 때문에 개발자는 비즈니스 로직에 더 집중할 수 있다. 하지만 객체 간 복잡한 참조가 발생할 경우, 개발자가 인지하지 못한 곳에서 객체가 메모리에서 제대로 해제..
열 공간 (Column Space)
·
[Mathematics] - Linear Algebra
이론행렬 A의 열 벡터들에 대한 가능한 모든 선형 조합(Ax)의 결과를 모아 집합으로 구성할 수 있을 것이다. 이를 집합을 열 공간이라고 한다. 열 공간은 다음과 같이 표기한다. - Consistent Linear System선형 시스템 Ax = b가 해를 가지면 다음을 만족한다. - Inconsistent Linear System선형 시스템 Ax = b의 해가 없으면 다음을 만족한다. 위의 행렬의 열 공간은 3차원 공간이다. 세 개의 열 벡터가 존재하기 때문에 3가지 방향으로 갈 수 있기 때문이다. 따라서, 어떤 3-벡터 b를 이용해 선형 시스 Ax = b를 구성한다고 하더라도, 해당 선형 시스템의 해는 존재한다. (Consistent Linear System) 반면 위 행렬의 열 공간은 ..
선형 조합 (Linear Combination)
·
[Mathematics] - Linear Algebra
https://dev-ryuon.tistory.com/45?category=943371 # 0. 선형 시스템 (Linear System)[이론] 중고등학교때 다들 '함수'라는 개념은 익히 알고있을 것이다. 함수는 방정식으로써 표현이 가능하고, 미지수가 적을 경우 수기로도 충분히 해를 구할 수 있다. 하지만, 방대한 양의 데이dev-ryuon.tistory.com이 포스트는 선형 시스템에 대해 숙지하고 보시는 것을 추천합니다. 이론선형 조합을 이해하기 이전에 행렬을 구조적으로 보는 시점이 중요하다. 위 그림과 같이 행렬을 열 벡터의 집합으로 해석할 수 있다. 그 뜻은 행 단위로도 묶어서 해석할 수 있다. 하지만 보통은 열 벡터로 해석한다. 이제, 선형 시스템 Ax를 구조적으로 볼 수 있는 시야를 가지게..
행렬 연산 (Matrix Operations)
·
[Mathematics] - Linear Algebra
이번 포스트에서는 행렬의 간단한 표기법들과 종류, 연산들에 대해 알아볼 예정이다. 이론행렬의 표기법m x n 행렬은 다음과 같이 표기한다. 그리고 행렬의 i번째 행의 j번째 열의 요소는 다음과 같이 표기한다. 행렬의 종류- 전치 행렬 (Transpose Matrix)전치행렬은 특정행렬의 행과 열을 바꾼 행렬이다. i번째 행의 j번째 열의 요소는 j번째 행의 i번째 열의 요소와 자리가 바뀐다. 위와 같은 행렬이 존재한다고 가정하자. A의 전치행렬은 다음과 같다. - 영 행렬 (Zero Matrix)모든 요소가 0으로 이루어진 행렬을 의미한다.영 행렬은 행렬 덧셈 연산에 대한 항등원 역할을 한다. - 정방 행렬 (Square Matrix)행과 열의 갯수가 동일한 행렬을 의미한다. - 항등 행렬 (I..
VSCode C++ 환경설정
·
[ETC] - C++
https://sourceforge.net/projects/mingw/files/ MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net×sourceforge.net 위 링크에서 최신 버전의 MinGW.exe을 다운로드한다. 그 다음 다운로드 받은 실행파일을 펀쿨섹좌 빙의하여 continue 하고 다음과 같은 4개의 패키지를 체크한다. 체크하는 방법은 우클릭 후 "Mask for Installation"을 클릭하면 된다. 체크를 마치면 좌측 상단의 Installation 탭의 Apply Change를 클릭한 후, 새로 뜬 창에서 Apply 버튼을 누르면 된다. 그리고 환경변수를 지정할 차례이다. Windows 10 검색에서 "시스..
LU 분해 (LU Decomposition)
·
[Mathematics] - Linear Algebra
https://dev-ryuon.tistory.com/46 # 1. 가우스 소거법 (Gauss Elimination)[서론] 선형 시스템은 해를 가지는 케이스가 총 3가지로 나누어진다. 1. 해가 하나인 경우 - x=2 인경우에만 성립한다. ex) 3x = 6 2. 해가 여러개인 경우 - 어떠한 x를 대입하더라도 성사된다. ex) 0x = 0dev-ryuon.tistory.com이 포스트는 가우스 소거법에 대해 숙지하고 보시는 것을 추천합니다. 이론LU 분해는 Gauss Elimination 을 행렬이라는 자료구조로 표현한 것을 의미한다. 숫자는 인수분해가 가능하다. 행렬도 숫자와 마찬가지로 분해가 가능하다. 행렬을 분해하는 방법에는 대표적으로 세 가지가 있다. LU DecompositionQR Deco..
가우스 소거법 (Gauss Elimination)
·
[Mathematics] - Linear Algebra
https://dev-ryuon.tistory.com/45 # 0. 선형 시스템 (Linear System)[이론] 중고등학교때 다들 '함수'라는 개념은 익히 알고있을 것이다. 함수는 방정식으로써 표현이 가능하고, 미지수가 적을 경우 수기로도 충분히 해를 구할 수 있다. 하지만, 방대한 양의 데이dev-ryuon.tistory.com이 포스트는 선형 시스템에 대해 숙지하고 보시는 것을 추천합니다. 이론선형 시스템은 해를 가지는 케이스가 총 3가지로 나누어진다. 1. 해가 하나인 경우 - x=2 인경우에만 성립한다.ex) 3x = 6 2. 해가 여러개인 경우 - 어떠한 x를 대입하더라도 성사된다.ex) 0x = 0 3. 해가 존재하지 않는 경우 - 어떠한 x를 대입하더라도 성사되지 않는다.ex) 0x = ..
선형 시스템 (Linear System)
·
[Mathematics] - Linear Algebra
이론중고등학교때 다들 '함수'라는 개념은 익히 알고있을 것이다. 함수는 방정식으로써 표현이 가능하고, 미지수가 적을 경우 수기로도 충분히 해를 구할 수 있다. 하지만, 방대한 양의 데이터들의 상관관계를 수학으로 표현하기란 쉽지 않다. 우리는 이러한 상관관계를 파악하고 해를 구하기 위해 선형 시스템이라는 개념을 숙지해야 한다. 선형 시스템이란 선형 방정식 (Linear Equation)들의 집합이다. 선형 방정식은 말 그대로 직선형태의 함수 즉, 1차 함수 방정식을 의미한다. 예를 들어보자. $3x + y + z = 4$$x - 2y - z = 1$$x + y + z = 2$ 다음과 같이 세 가지 방정식이 있다. 각각의 방정식은 Linear Equation이 된다. 그리고 미지수(Unknow, Vari..
[Tip] 딕셔너리 Fancy하게 다루기
·
[Language] - Python
개요이번 포스트에서 다룰 내용은 딕셔너리를 좀더 fancy하게 다루는 방법들을 알아보려고 한다. 물론 기본 문법(for loop, if, ..)들로도 충분히 원하는 딕셔너리에 대한 데이터 전처리가 가능하지만, 가능한 가독성이 좋고 Python에서 지원하는 문법들을 적극 활용하여 딕셔너리를 다룰 수 있는 방법들이 있다. 딕셔너리 컴프리헨션 (Dictionary Comprehension)# 컴프리헨션 적용 전squares = {}for x in range(10): squares[x] = x ** 2# 컴프리헨션 적용 후 ({키: 밸류 for 원소 in 반복할 iterable})squares = {x: x ** 2 for x in range(10)}print(squares) # {0: 0, 1: 1, ..
[Util] QTableWidgetUtils
·
[Framework] - PyQT
from collections import OrderedDictfrom qgis.PyQt.QtCore import Qtfrom PyQt5.QtWidgets import QTableWidgetfrom PyQt5.QtWidgets import QTableWidgetItemfrom siqms_src.utils.ui_utils import UIUtilsclass QTableFormat: def __init__(self): self._form = OrderedDict() def __len__(self): return len(self._form) def __sub__(self, row: tuple): self._form.pop(row) def __getit..
QSplitter
·
[Framework] - PyQT
필자는 위젯을 배치하여 유연하게 사이즈를 조절하는 법이 궁금했다.. 현재 두개의 QTableWidget을 QMainWindow에 생성한 상태이다. 정렬할 위젯들을 복수 선택한다. 위의 빨간 버튼을 클릭하면 가로든 세로든 유연하게 배치할 수 있다. QSplitter 안에 위젯들이 정렬된 것을 확인할 수 있다. 이는 실행되는 상태에서도 마우스를 통해 위젯의 크기를 조절할 수 있다.
Convolution Neural Network (CNN) - Code
·
[AI] - Neural Network
지난 포스트에서는 CNN의 개념에 대해 살펴보았다. 이번 포스트에서는 CNN을 실제로 구현 및 학습하는 코드를 직접 작성해본다. 코드는 Pytorch를 기반으로 작성했다.1. 필요한 모듈 import import torchimport torchvisionimport torchvision.transforms as transforms 필자는 시각데이터(이미지)를 다룰 것이기 때문에 torchvision 모듈을 택했다. 2. transform 정의 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 이미지를 텐서형태로, 평균은 0.5, 표준편차도 0..
Convolution Neural Network (CNN) - Theory
·
[AI] - Neural Network
이번 포스트에서는 합성곱(Convolution) 연산을 기반으로 이미지에서 특징을 검출하는데에 적합한 신경망인 CNN에 대해 알아본다. 먼저 CNN의 전체적인 구조에 대해 살펴보자. Input으로 이미지가 들어오면 Convolution, Activation function, Pooling 세 가지의 레이어가 반복적으로 나타난다. 이 과정은 이미지로부터 작은 특징들부터 조합하여 점점 큰 특징들을 검출하는 과정이다. 그 후에는 Flatten 과정을 통해 검출한 특징들에 대한 이미지(feature map)를 일렬로 펼치는 작업을 수행한다. 마지막으로 Fully Connected 레이어를 통해 모든 클래스에 대해 일치할 확률을 출력한다. CNN의 구조에 나오는 기본용어에 대해서 간략하게 정리해보자. 그전에, ..
ILSVRC 2012 Dataset
·
[AI] - Neural Network
이 포스트를 작성시간 기준으로 ImageNet의 서버가 동작하지 않아 다른 방법으로 데이터세트를 얻는 방법을 포스팅한다. (기존 방법)Training Set (138GB)wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tarValidation Set (6GB)wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar (해당 포스트에서 진행하는 방법)academictorrents.com/collection/imagenet-2012지금은 토렌트를 사용하여 위 링크에서 데이터 세트를 얻어야 한다. 토렌트로 받은 압축파일 (.ta..
QgsLayerTree
·
[Framework] - QGIS
root: QgsLayerTree = QgsProject().instance().layerTreeRoot()QgsLayerTree 클래스는 QgsLayerTreeNode클래스 기반이므로 child()와 parent() 메소드를 통해 부모, 자식 노드를 반환할 수 있다. 이는 계층형 UI의 model을 구현할 때 용이하다. """/*************************************************************************** begin : email : ***************************************************************************..
QGIS MV (Model-View) 패턴
·
[Framework] - QGIS
필자는 QGIS Framework의 위와 같은 UI에서 여러 그룹을 선택했을 때 해당 그룹들을 반환하는 유틸을 작업했다. QGIS에서 자체적으로 선택된 레이어를 반환하는 QgisInterface.activeLayer() 메소드가 있지만 해당 메소드는 하나의 레이어밖에 못가져오는 한계가 있다. 일단 이 포스트를 시작하기 이전에 염두해야할 사항이 있다. 1. QGIS Framework는 PyQT 기반이라는 것2. MV (Model-View) 패턴으로 UI가 구성되어 있다는 것 우선 다음과 같은 코드로 레이어 패널에 속한 그룹의 트리(QgsLayerTree)를 가져왔다.root = QgsProject.instance().layerTreeRoot() 그리고 해당 트리를 model에 import한 다음 view에..
[Tip] win32com 모듈을 사용한 엑셀 제어
·
[Language] - Python
# Excel.Application COM 인스턴스 생성excel = win32.Dispatch("Excel.Application")excel.Visible = Truecell = None# 파일 열기workbook = excel.Workbooks.Open(self.path)# 시트 순회for worksheet in workbook.Worksheets: print('This sheet name is .. ', worksheet.Name) # 시트 이름 출력 cell = worksheet.UsedRange.Find(self.tag) # 워크시트의 Range 인스턴스에서 찾기 if not cell: continue worksheet.Range(str(cell.address).replace("$", ''..
Feature Scaling and Normalization (StandardScaler, MinMaxScaler)
·
[AI] - Machine Learning
서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 feature scailing이라고 한다.그에 대표적인 방법으로는 표준화(Standardization)와 정규화(Normalization)이 있다. 1. Standardization (StandardScalar)표준화는 가우시안 정규 분포를 따르도록 데이터의 피처를 변환하는 작업이다.여기서 가우시안 정규 분포는 평균이 0, 분산이 1인 분포를 의미한다.서포트 벡터 머신, 선형회귀, 로지스틱 회귀에서는 데이터가 가우시안 정규 분포를 따르는 것을 가정한다.표준화는 보통 하나의 데이터 그룹에 대해 표준화를 할 때 사용한다.특정 데이터가 데이터 그룹에서 어느 위치에 있는지 파악하기 위함.$z_i = \frac{x_i - mean(x)} {stdev(x)..
제너레이터 (Generator)
·
[Language] - Python
개요이번 포스트에서는 제너레이터에 대해 알아보고자 한다. 제너레이터는 지연 평가(Lazy Evaluation)을 통해 효율적인 메모리 관리를 가능케 해주는 iterable 객체이다. 제너레이터를 이해하기 위해서는 Eager Evaluation과 Lazy Evaluation의 개념을 알아야 한다. Eager Evaluationdef return_func(): print('return!') return 1li_com = [return_func() for i in range(10)]print(li_com)>>return!return!return!return!return!return!return!return!return!return![1, 1, 1, 1, 1, 1, 1, 1, 1, 1]Eager는 ..
QgsVectorDataProvider
·
[Framework] - QGIS
QgsVectorLayer 클래스의 dataProvider() 메소드를 호출하면 해당 벡터 레이어의 QgsVectorDataProvider 인스턴스를 얻을 수 있다. 이 인스턴스는 벡터 레이어에 속하는 QgsFeature 인스턴스들을 추가, 수정, 삭제를 할 수 있다. self.connection_feature = QgsFeature()connection_geometry = QgsGeometry().fromPolylineXY(points)self.connection_feature.setGeometry(connection_geometry)self.connection_layer.dataProvider().addFeatures((self.connection_feature,))위 코드는 QgsFeature 인스..