본문 바로가기

전체 글

(68)
Gradient Boosting Algorithm 1. boosting이란? boosting는 머신러닝 앙상블 학습 방식의 한 가지 종류이다. 머신러닝에서 앙상블이란, 하나의 모델이 데이터에 과적합되는 것을 막기 위해 여러 모델을 써서 학습하는 방식이다. boosting 방식의 특징은 학습에 필요한 데이터를 순차적으로 구성해 나간다는 것이다. 아래 그림을 보면 그 방법을 알 수 있다. 데이터가 주어지면 첫번째 모델이 학습을 진행한다. 이 과정에서 잘못 분류한 데이터에 다음 모델 학습 때 가중치를 부여한다. 이 과정을 N번 반복하면서 만들어진 모델을 모두 합한 것이 최종 모델이다. 2. 예시 Gradient Boost은 Boosting 방법 중 최근에 많이 쓰이는 방법이다. 다음 데이터를 바탕으로 키, 좋아하는 색깔, 성별이라는 정보로 몸무게를 예측하는 ..
유시민의 글쓰기 특강을 읽고 1. 책 소개 30여 년간 베스트셀러 작가로서, 정치 평론가로서 글을 써온 유시민이 쓴 책이다. 그는 글을 잘 쓰기 위해서는 독해력이 중요하다고 말한다. 어떻게 하면 글쓰기 실력을 키울 수 있을지에 대해서도 설명한다. 나쁜 글을 좋은 글로 바꾸는 방법도 알려준다. 2. 내용 요약 독해력의 중요성 독해력은 글을 잘 쓰기 위해 가장 필요한 능력이다. 좋은 글을 쓰기 위해서는 지식과 정보, 논리 구사력, 자료 독해 능력, 어휘와 문장 구사력이 필요하다. 이 모두를 가장 효과적으로 얻을 수 있는 경로가 바로 책이다. 또한 좋은 책을 읽고 그 책을 요약해보는 훈련도 중요하다. 이를 위해서는 글을 쓰는데 필요한 지식과 어휘를 배울 수 있고, 정확하고 바른 문장을 구사한 책을 골라야 한다. , , 가 바로 그런 책이..
[파이썬 알고리즘 인터뷰] 17. 전화번호 문자 조합 1. 문제 leetcode 17. letter combinations of a phone number 2에서 9까지 숫자가 주어졌을 때 전화번호로 조합 가능한 모든 문자를 출력하라. 숫자와 문자의 관계는 다음과 같다. 2. DFS를 이용한 해결 방법 이 문제는 하나의 경로로 탐색을 시작하면 해당 경로로 탐색을 마쳐야 한다. 따라서 DFS(깊이 우선 탐색)를 사용해야 한다. def letterCombinations(self, digits: str) -> List[str]: def dfs(index, path): # 끝까지 탐색하면 백트래킹 if len(path) == len(digits): result.append(path) return # 입력값 자릿수 단위 반복 for i in range(index, ..
[파이썬 알고리즘] DFS와 BFS를 이용한 그래프 탐색 1. 그래프란? 연결된 객체 간의 관계를 표현하는 자료구조 그래프 G(V, E)는 어떤 자료나 개념을 포함하는 정점의 집합 V(vertex)와 이를 연결하는 간선의 집합 E(edge)로 구성된다. 정점(node, vertex): 여러 가지 특성을 가질 수 있는 객체 간선(Edge): 정점 사이의 관계 2. 그래프의 표현 방식 1) 인접 리스트: 딕셔너리를 이용해 출발 노드를 키로, 도착 노드를 값으로 저장하는 방식 실제 연결된 노드에 대한 정보만 저장하기 때문에 공간을 덜 차지한다. 특정 두 노드를 연결하는 간선이 있는지 확인하기 위한 시간이 오래 걸린다. 2) 인접 행렬: i에서 j로 향하는 경로가 있다면 matrix[i][j] = 1, 없다면 0으로 설정하는 방식 많은 공간을 차지하지만, 원하는 경로..
[파이썬 알고리즘] 16. 페어의 노드 스왑 1. 문제 leetcode 24. swap nodes in pairs 한방향 연결리스트가 주어지면 인접한 모든 두 노드의 방향을 바꾸어 바뀐 리스트의 head를 리턴하여라. 2. 반복을 이용한 풀이 이 문제를 해결하기 위해서는 인접한 두 노드 간의 포인터 방향만 바꾸면 안된다. 앞에 있던 노드가 가리키는 포인터 방향도 바꾸어야한다. 포인터 세개를 관리하면서 반복문을 통해 문제를 해결할 수 있다. 먼저 head 뒤 노드를 b, 앞 노드를 prev라고 지정한다. 그리고 b가 head를 가리키고, head는 b 다음의 노드를 가리키도록 한다. 원래 head를 가리키던 prev는 p를 가리키도록 한다. 마지막으로 다음 비교를 위해 head, prev를 뒤로 한칸씩 옮긴다. 이 과정을 두 개 이상의 노드가 남아 ..
[파이썬 알고리즘] 15. 두 수의 덧셈 1. 문제 leetcode 2. Add two numbers 역순으로 연결된 두 리스트의 합을 구하여라. 2. 내 풀이 먼저 각 리스트 노드의 값을 가져올 포인터 l1, l2를 만든다. 그리고 l1, l2 뒤의 노드를 가리킬 p1, p2, 올릴 수를 저장할 carry 변수를 만든다. 그리고 l1, l2가 존재할 동안 탐색을 진행한다. 탐색에서는 l1, l2의 값과 carry를 더해 sum 변수에 저장한다. sum의 10의자리수는 carry에 저장해 올리고, 1의자리수는 l1, l2에 모두 저장한다. 그리고 l1이나 l2 중 하나만 남아있다면 carry와 남아있는 리스트의 값만 더해서 sum과 carry를 구한다. 마지막으로 리스트의 모든 노드를 더했는데 carry가 남아있다면 새 노드를 만들어 해당 ca..
[파이썬 알고리즘] 14. 역순 연결리스트 1. 문제 leetcode 206. Reverse linked list 한방향 연결리스트 head가 주어지면, 이를 뒤집어서 리턴하여라. 2. 반복을 이용한 내 풀이 현재노드 head, 이전노드 prev를 이용해 리스트의 끝까지 탐색하며 연결의 방향을 바꾸었다. 먼저, head 뒤 노드를 가리키는 포인터 prev를 만든다. 그리고 리스트가 종료되어 head가 None이 될 때까지 prev와 head를 한칸씩 앞으로 옮기며 리스트를 탐색한다. 동시에 이전에 prev에 있었던 노드를 현재 앞으로 옮겨진 prev가 가리키게 하며 리스트 연결의 방향을 바꾼다. 리스트 탐색이 종료되면 뒤집어진 리스트의 시작부분인 prev를 리턴한다. 이 방법으로 실행속도와 메모리 사용량 모두 상위 1.56%를 달성하였다. 3. ..
[파이썬 알고리즘 인터뷰] 13. 두 정렬 리스트의 병합 1. 문제 leetcode 21.Merge two sorted list 두개의 오름차순으로 정렬된 연결리스트 list1, list2가 주어진다. 두 리스트를 오름차순으로 정렬된 하나의 연결리스트로 만들어 리턴하여라. 두 리스트를 이루고 있는 노드들을 이용해야한다. 2. 연결리스트를 하나씩 탐색한 풀이 먼저 두 리스트 맨 앞에 값을 비교하고 작은 값을 sort 포인터로 가리킨다. sort로 가리킨 리스트는 리스트 포인터를 다음 노드로 옮긴다. 둘 중 어떤 한 리스트가 끝나면 반복을 종료한다. 그리고 남은 다른 리스트의 노드들을 sort에 연결시킨다. 3. 재귀함수를 이용한 풀이 책에서는 재귀함수를 이용해서 간결하게 문제를 풀었다. 별도의 포인터나 연결리스트를 만들지 않고 list1에 합친 연결리스트를 만들..