본문 바로가기

전체 글100

[알고리즘] 퀵 정렬[Quick sort]이란? 분할 알고리즘의 하나로 평균적으로 굉장히 빠른 시간 복잡도를 갖고 있는 정렬 방법이다. 기준이 되는 데이터 값을 정하고 (이를 피벗(Pivot)이라고 칭한다.) 이를 중심으로 피벗 앞에는 피벗보다 작은 값이 오고 피벗 뒤의 값에는 피벗보다 큰 값이 온다. 이렇게 두 개의 작고, 큰 부분들을 나누는 것을 분할이라고 부르며 분할되어진 두개의 리스트에 대해 재귀적으로 이 과정을 반복하여 정렬한다. 코드는 아래와 같다. def quick_sort(li): if len(li) pivot: more.append(i) else: equal.append(i) return quick_sort(less)+equal+quick_sort(more) 2022. 6. 17.
[알고리즘] 삽입 정렬(Insertion Sort) 삽입 정렬(insertion sort)란? 데이터를 하나씩 확인하면서 , 각 데이터를 적절한 위치에 삽입 하는 정렬 방법이다. 더불어 삽입 정렬은 특정한 데이터가 정렬 되기 이전에 앞까지의 데이터들은 이미 정렬 되어있다고 가정하고 그 리스트에서 적절한 위치에 삽입이 되어지는 알고리즘이다. 데이터가 필요할 때만 위치를 바꾸므로 실행시간 면에서 효율적인 정렬 방식이다. 선택 정렬과 같이 동작원리를 직관적으로 이해하기 쉬운 알고리즘이다. def insertion_sort(li): for i in range(1, len(li)): for j in range(i, 0, -1): # 인덱스 i부터 1까지 감소하며 반복하는 문법 if li[j] < li[j-1]: li[j], li[j-1] = li[j-1], li[.. 2022. 6. 13.
[알고리즘] 버블 정렬 (bubble sort) 버블정렬(bubble sort) 란? 서로 이웃한 두 원소의 크기를 비교한 결과 순서대로 정렬되어 있지 않으면 교환을 반복하여 정렬을 진행하는 알고리즘이다. 구체적으로 말하자면 첫 번째 데이터와 두 번째 자료를, 두 번째 자료와 세 번째 자료를 ···· 이런 식으로 마지막 자료까지 서로 크기를 비교하여 교환하며 정렬하는 방식이다. 이렇게 첫번째 회전이 수행이 되고나면 가장 큰 자료가 맨 뒤로 가게 되며 두번째 회전부터는 맨마지막의 자료를 정렬에서 제외하고 이 과정을 반복한다. 가장 간단하지만 비효율적인 알고리즘이다. 이는 위의 예시와 같이 목록이 이미 정렬이 되어있어도 모든 항목을 검사하기 때문에 많은 시간복잡도가 걸리기 때문이다. 코드는 아래와 같다. def bubble_sort(li): n = len.. 2022. 6. 13.
죄 또는 형벌에 대하여(D.P) 간만에 D.P를 다시보며 순수하게 미술선생의 꿈을 꾸는 조석봉 역(조현철)을 보며 사회가 정의한 법에 대한 모순을 느꼈다. (지금 당장 생각이 안난다면 조석봉은 선임에게 조선봉 자신의 성기를 보여주고 자위를 하라는 명령을 받은 장면이 두번 이상이며 못이 박힌 벽 앞에서 맞고 피난 장면을 떠올려보라.) 사회에서 정의한 죄라 함은 분명 죄를 지은 사람에 대해, 혹은 죄를 지었다고 확정이 될 증거가 있는 사람에게만 형별을 주는 것을 의미한다. 하지만 모순적이게도 D.P 이야기뿐만 아니라 사람은 자기가 지은 죄에 대해 크게 반성(작게 무단횡단 또는 쓰레기 버리기 등) 반성하지도 않는다. 반성을 하는 일이 생긴다면 그건 누군가가 잘못된 행동에 관해 지적을 할 순간일 것이다. 이러한 관점에서 보자면 법은 과연 우리.. 2022. 6. 9.
[자료구조] 스택(Stack)과 큐(Queue) 스택(Stack) 스택이란 나중에 넣은 데이터가 먼저 반환이 될 수 있도록 설계한 메모리 구조를 의미한다. LIFO(Last In Firt Out), 선입후출이 라고도 한다. 실생활에서의 예시는 윈도우 운영체제를 들수있다. (컴퓨터를 실행시 가장 먼저실행되고 종료시 가장늦게 꺼진다.) 파이썬으로 구현한 스택의 클래스는 아래와 같다. class Stack(): def __init__(self): self.data = [] def push(self, item): self.data.append(item) def pop(self): if len(self.data) > 0: return self.data.pop() else: return None def return_stack(self): return self.d.. 2022. 6. 8.
내장 함수 set 함수 사용법 SET 함수의 선언법 set 함수는 딕셔너리와 비슷하지만 key가 없고 값만 존재한다. set 함수는 자동으로 중복된 값을 제거해준다. set의 선언은 set([])을 이용하거나 중괄호를 선언하고 바로 값을 삽입하면 된다 아래 예시로 확인해보자. SET 함수의 이용법 set에서 원소의 추가는 add를 사용한다. set에서의 여러 값의 추가는 update를 사용한다. set에서의 제거는 remove 함수 혹은 discard 를 사용한다 이 둘의 차이는 remove는 set 함수내에 값이 없으면 오류를 보여주고 discard를 이용하면 안에 값이 없더라도 에러가 발생하지 않는다. 아래 예시를 통하여 확인해보자. 2022. 6. 1.
생성적 적대 신경망(Generative Adversarial Networks GAN)이란? 생성적 적대 신경망(GAN)이란? 생성자(Generator)는 실제와 동일한 데이터를 만들기 위해 노력하고 판별자(Discriminator)가 생성된 데이터가 진짜인지 아닌지를 판단하는 학습방식이다. 이는 이미지를 받아 이진분류(실제 이미지에는 양수 가짜에는 음수를 출력)를 수행하는 역할을 하기 떄문에 LeakyReLU함수를 사용한다. 처음에는 성능이 안좋을 수 도 있지만 학습을 거듭하며 점점 발전하게 되는 기술이다. 아래예시를 보고 이해를 해보자 Cycle Gan이란? 특정이미지의 도메인특성을 유사한 부분의 특성으로 적용할 수 있는 역할을 하는 GAN 생성자 2개가 필요하며 각각의 생성자는 A→B, B→A 로 이미지를 변경하게 된다. 판별자 역시 2개를 필요하며. 각각의 판별자는 A, B 에 대해 Re.. 2022. 5. 19.
오토인코더(AutoEncoder, AE) 란? 오토인코더란 무엇이고 왜 사용하는 것일까? AutoEncoder(오토인코더)는 입력 데이터를 저차원의 벡터로 압축한 뒤 원래 크기의 데이터로 복원하는 신경망이다. 쉽게 말해 단순히 입력을 출력으로 복사하는 신경망이다. 비지도학습에서 사용되며 입력 데이터를 가공하여 목표값을 출력하는 방식이 아니기에 레이블 정보가 없는 데이터의 특성을 분석하거나 추출을 목표로 사용된다. 또한 차원 축소나 데이터의 압축, 데이터의 노이즈 제거, 이상치를 탐지하는데에도 이용한다. 인코더의 역할은 입력을 내부 표현(데이터 차원을 축소시켜 벡터로 압축)으로 변환을 한다. 디코더의 역할은 내부 표현(*Latent 벡터를 업샘플링)을 출력으로 변환 한다. *Latent(잠재 벡터): 원본 데이터보다 차원이 작으면서, 데이터의 특지을 .. 2022. 5. 18.
이미지 분할(Segmentation)이란? 이미지 분할(Segmentation)이란? 한 이미지 내에서 같은 의미(사람은 사람,차는 차)를 가지고 있는 부분을 구분해내는 것이다. 즉 사진의 예시처럼 이미지 내 다양한(사람,자동차,도로,표지판) 등을 픽셀 단위로 레이블을 예측하여 구분하는 것이다. 분할은 크게 Semantic Segmentation와 (Semantic) Instance Segmentation로 구별되는데 예시는 아래와 같다. 위의 예시처럼 많은 의자를 동일하게 의자 하나로 볼 것인가, 아니면 각 의자마다 레이블을 줄 것인가? 의 차이이다. 분할에 대한 의미는 파악했으니 대표적인 분할 모델인 FCN, U-net에 대해 알아보자 FCN(Fully Convolutional Networks) 분할(Segmantation)은 픽셀 단위로 분.. 2022. 5. 17.