지난 글에서 기계학습의 개요를 정리하면서, 기계학습은 입력 데이터의 분포를 잘 설명하는 함수(모델)를 찾는 과정이라고 정리하였다.이번 글에서는 가장 간단한 모델인 선형 회귀와 해당 모델을 학습시키는 경사 하강법에 대해서 정리해본다. 지난 글에서 본 것처럼 컴퓨터가 인식하는 '데이터'는 숫자의 묶음이다.이미지의 경우에는 RGB 3개 숫자 데이터의 2차원 묶음 (따라서 결과적으로는 3차원 배열) 이다.만약 이 이미지의 크기가 50 픽셀 x 50픽셀 이라면, 50 x 50 x 3 = 7500 개 숫자들의 배열이 된다.그리고 이 숫자들을 7500 x 1 크기의 행렬로도 표현할 수 있다. 이 행렬은 수학적으로 7500차원 좌표계 위에 있는 하나의 점으로 생각할 수 있다.또 다른 50픽셀 x 50픽셀 이미지들을 ..
“Machine learning is a branch of artificial intelligence (AI) and computer science which focuses on the use of data and algorithms to imitate the way that humans learn, gradually improving its accuracy.” 기계학습은 AI, 사람이 학습하는 방식을 모방하는 알고리즘과 대량의 데이터를 사용하여 정확도를 개선하는 컴퓨터 과학 분야의 한 갈래이다. 강의록에 나와있는 이 문장이 지금까지 배운 기계학습의 전부를 담고있다고 생각한다.3년전만해도 손글씨를 인식하는 모델은 새롭고 신기한 모델이었다. 실제로 대학교 2학년 때 주변에서 들었던 아이디어 중에 사람 손글..
Java EnumSet 을 파헤차다가 다시 마주치게 된 synchronized 키워드운영체제 수업시간에도 잠깐 등장했었는데, 이렇게 다시 만나게 된 김에 제대로 공부해보려고 한다. 참고) 이 글의 내용은 자바의 synchronized 공식 문서에 대한 번역에 가까워질 것 같다. 문제 상황프로세스의 실행 흐름 중 하나인 스레드는 주로 필드와 필드가 참조하고 있는 객체 참조 (object reference) 에 대한 접근 권한을 공유하며 서로 상호작용한다.이와 같은 상호작용 방법은 매우 효율적이지만, 2가지 에러를 발생시킬 가능성이 있다. 1. Thread Interference (스레드 간섭)2. Memory Consistency Errors (메모리 일관성 문제) 그리고 Synchronization(동기..
프로젝트를 하다보면 다중 선택 구조를 구현해야 할 때가 있다.예를 들어, 일자리 중개 서비스를 만들 때 근무 가능 요일을 월화수목금토일 중에서 자유롭게 선택하는 구조가 될 수 있다.이때는 하나만 선택 가능한 것이 아니라, 여러 개를 중복으로 선택할 수 있기 때문에, 사용자의 선택값을 어떻게 데이터베이스에 저장할 지 고민이 필요했다.JPA로 테이블을 구현하면서 이 데이터를 어떻게 저장할 지 찾아보다가 EnumSet 이라는 컬렉션을 알게 되었다.말그대로 Enum 타입 데이터를 갖는 Set 으로 다른 Set에 비해 더 빠르게 읽고 쓰기를 할 수 있다고 한다. A specialized Set implementation for use with enum types. All of the elements in an e..
3월 31일에 쓰면 좋겠지만 월요일이라서 바쁘다는 핑계로 쓰지 못 할까봐 미리 쓰는 3월 회고3월에는 개강하고 역시 많은 일들이 있었다.너무 일을 많이 벌렸나 싶으면서도 또 다 하고 싶었던 일들이니까.. 잘 수습?해봐야겠다 진로와 관련된 목표전공1. 졸업 프로젝트졸업프로젝트로 '한글 SQL 데이터베이스' 만들기 프로젝트를 본격적으로 시작했다.유튜브 알고리즘 추천으로 우연히 '코딩스키스키' 라는 버튜버 채널을 발견했다.엔비디아에 다니는 개발자가 버추얼 캐릭터를 만들어 운영하던 유튜브 채널로, 이력서 작성하는 방법, 대학생 때 해두면 좋은 것 등의 영상이 있었는데, 해당 영상에서 오픈 소스를 읽어보면 좋다고 추천한 것 중에 SQLite 가 있었다.1.0 버전은 소스코드가 1만줄 밖에(?) 안된다고 읽어보기 ..
문제 설명https://www.acmicpc.net/problem/1876 지름이 20cm 인 볼링공을 너비 105cm 인 레인 위에서 굴린다.볼링공이 구르기 시작한 첫 위치는 레인의 정 가운데 위치이고, 해당 위치에서 x도 각도로 굴린다.굴러간 공은 레인 벽과 부딪히면 입사각과 동일한 각도로 반사되어 튕긴다.볼링공이 구르기 시작한 첫 위치로부터 T 미터 떨어진 곳에 지름 12cm 인 볼링 핀이 있다. 처음 굴리기 시작한 각도 x 와 볼링공과 볼링핀 사이 거리 T 가 주어질 때, 이 볼링공이 볼링핀을 맞히는지 여부를 출력하라. 접근 방법우선 각도에 따라서 공이 여러번 튕길 수 있고, 매번 튕기는 것을 다 시뮬레이션으로 구현하는 것은 너무 복잡해보였다.그래서 수학적으로 문제를 풀 수 있을 것 같아서 태블..
https://school.programmers.co.kr/learn/courses/30/lessons/42628 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 백준에도 똑같은 문제가 있다.전에 프로그래머스 레벨 테스트에서 이 문제를 만났다가 구현에서 막혀서 못 풀었던 기억이 났다.(백준에서도 힘들게 풀었었는데..) 이번에 다시 풀어볼 때는 한번에 잘 풀려서 기분이 좋았다. (옛날 풀이는 기억이 나지 않고 완전히 새로운 느낌으로 풀었다.)이 문제의 핵심은 최소힙과 최대힙을 만들고, 이 둘 사이에 데이터 동기화를 잘 시켜주는 것이다. 먼저 데이터를 추가할 때는 두 힙에 모두 데이터를 추가한다.최솟값을 삭..
https://school.programmers.co.kr/learn/courses/30/lessons/81305# 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 이진트리를 k개 그룹으로 분할할 때, 각 그룹에 있는 노드가 가진 가중치의 합의 최댓값이 최소가 되도록 하는 문제최댓값이 최소가 되어야 한다는 점에서 이분탐색 (매개변수 탐색) 까지는 어렵지 않게 떠올릴 수 있었으나, 이진트리를 k개로 분할하는 구현에서 막혀서 어려웠다. 처음에는 각 트리에 대해서 누적합을 구하고, 누적합 정보를 기반으로 쪼개는 풀이를 떠올렸다.하지만 이 풀이가 27점 맞고 틀려서 디버깅하다가 반례를 못찾아서 클로드에 물어봤더..
https://school.programmers.co.kr/learn/courses/30/lessons/42892 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr x좌표의 상대적인 위치를 이용하여 이진트리의 구성을 파악하고 전위/후위순위 결과를 출력하는 문제처음에는 직접 간선을 연결하고 그래프 순회를 해야하나 생각했는데, '이진트리' 라는 특성상 계속해서 좌/우 구분이 나눠지는 관계를 이용해서 현재 루트 노드가 커버하는 범위를 계속 좁혀나가면서 특정 x좌표의 노드가 현재 노드의 왼쪽/오른쪽 자식인지 판단하도록 하였다.현재 노드의 자식노드인지 판별하는 것은 현재 노드가 커버하는 범위 안에 포함되어 있는지 ..
https://www.acmicpc.net/problem/1248어떤 수열의 연속하는 모든 부분수열 ai ~ aj 에 대한 합의 부호값 (+, 0, -) 를 알고 있을 때, -10 ~ 10 사이의 숫자를 사용하여 만들 수 있는 수열을 찾는 문제 처음에는 어떻게 해야할 지 감이 안왔는데, 보통 이렇게 알고리즘이 감이 안오는 문제는 입력 크기를 줄이고 완전탐색으로 풀도록 유도하는 경우가 많다. 이 문제도 수열의 길이가 최대 10으로 -10 ~ 10 까지 숫자 10개를 모두 시도해보면서 풀 수 있다.그렇다고 정말 나이브하게 완탐으로가면 21^10 이라는 경우의 수를 체크해야 한다.하지만 모든 부분수열의 ai ~ aj 부호값을 모두 만족해야 하는점에서 경우의 수를 치다보면 체크할 경우의 수가 확 줄어든다는 것을..