분류 전체보기 203

[모두를 위한 딥러닝] 학습계수, 데이터 표준화, 과적합

# 학습계수(하강간격)을 설정한다. learning_rate = 0.1 # 해당 지점의 기울기를 계산한다. gradient = tf.reduce_mean((W * X - Y) * X) # 기울기에 하강간격을 곱한 값을 W에 빼줘서 하강한다. descent = W - learning_rate * gradient # 해당 텐서에 업데이트 해준다. update = W.assign(descent) # tf.GradientDescentOptimizer(learning_rate=0.01) 학습계수 이전에 "[3] 텐서플로우 기초, 선형회귀" 에서 '하강 간격을 조정하기 위한 상수' 쯤으로 언급하고 넘어갔었던 개념이다. 위의 과정은 텐서플로우에 구현되어 있는 예쁜함수 GradientDescentOptimizer()의..

💻/ML 2020.08.04

[모두를 위한 딥러닝] 다중 분류, 소프트맥스 회귀

다중 분류 지난 포스팅에서는 0 / 1로 이루어진 데이터를 학습하고 결과를 도출(분류)하는 로지스틱 회귀에 대해서 다뤄보았다. 하지만 우리가 사는 세상은 두 가지 항목만 가지고 분류할 수 없는 것들이 너무나도 많다. 그렇다면 데이터를 여러가지로 구분해내는 다중분류(Multinomial Classification)는 어떻게 구현해낼 수 있을까? 왼쪽 데이터를 보고 세 개를 나누는 것은 사람에게는 일도 아니지만, 컴퓨터는 직관적이지 못하다. 먼저 배운 로지스틱 분류를 활용해보자. 이 문제를 A(빨간색)인 것과 아닌것, B(초록색)인 것과 아닌것, C(파란색)인 것과 아닌 것을 구분하는 세개의 작은 문제로 쪼개는 것이다. import tensorflow as tf tf.set_random_seed(777) x..

💻/ML 2020.08.03

[알고리즘] 카라추바의 빠른 곱셈(Karatsuba)

123 × 456 = ? 평소에 일상적으로 계산하던 방법을 분석적으로 풀어써보면 이렇다. 우리는 평소 한 자리에 0부터 9까지의 숫자만 사용하는 십진법을 사용하기 때문에, 각 자리별로 십의 자리 수는 다음 칸으로 넘겨준다(예를 들어 10의 자리 27은 (20 + 7)이므로 100의 자리로 2를 넘겨준다). (4 * 10000) + (13 * 1000) + (28 * 100) + (27 * 10) + (18 * 1) = (5 * 10000) + (6 * 1000) + (0 * 100) + (8 * 10) + (8 * 1) = 56088 최종적으로 값을 이렇게 계산해 낼 수있다. 456의 갯수만큼, 123의 각 원소(1, 2, 3)과 한 번씩 곱셈연산을 해야함을 알 수있다. 따라서 전통적인 방법으로는 만약 ..

[알고리즘] 분할정복(Divide & Conquer)

의 해당 단원 밑줄입니다. "분할 정복을 사용하는 알고리즘들은 대개 세 가지의 구성 요소를 갖고 있습니다. 문제를 비슷한 크기의 더 작은 문제로 분할하는 과정(divide) 각 문제에 대해 구한 답을 원래 문제에 대한 답으로 병합하는 과정(merge) 더이상 답을 분할하지 않고 곧장 풀 수 있는 매우 작은 문제(base case)" "같은 문제라도 어떻게 분할하느냐에 따라 시간 복잡도 차이가 커진다는 것을 보여주는 좋은 예입니다. 여러번 중복되어 계산되면서 시간을 소모하는 부분 문제들이 있기 때문입니다." ​​ 병합 정렬 (Merge Sort) 수열을 가운데에서 쪼개 두 개의 부분수열로 만들고, 각 부분 수열에 대해서도 같은 절차를 재귀 호출한다. 기저 사례(base case)까지 쪼개 값이 반환되면, ..

[알고리즘] 완전탐색(CLOCKSYNC)

algospot.com :: CLOCKSYNC Synchronizing Clocks 문제 정보 문제 그림과 같이 4 x 4 개의 격자 형태로 배치된 16개의 시계가 있다. 이 시계들은 모두 12시, 3시, 6시, 혹은 9시를 가리키고 있다. 이 시계들이 모두 12시를 가리키도록 �� algospot.com #include #include #include using namespace std; queue answer; const int button[10][5] = { {0, 1, 2, -1, -1}, {3, 7, 9, 11, -1}, {4, 10, 14, 15, -1}, {0, 4, 5, 6, 7}, {6, 7, 8, 10, 12}, {0, 2, 14, 15, -1}, {3, 14, 15, -1, -1}, ..

[알고리즘] 완전탐색(BOARDCOVER)

algospot.com :: BOARDCOVER 게임판 덮기 문제 정보 문제 H*W 크기의 게임판이 있습니다. 게임판은 검은 칸과 흰 칸으로 구성된 격자 모양을 하고 있는데 이 중 모든 흰 칸을 3칸짜리 L자 모양의 블록으로 덮고 싶습니다. 이 �� www.algospot.com #include #include #include using namespace std; queue answer; int row, col; int matrix[20][20]; int run() { /* 왼쪽 위 부터 탐색하여 비어있는 칸을 x,y에 저장 * flag 지정하여, 찾는 즉시 반복문 탈출 * x, y가 반복문을 그대로 통과하면 모두 채워졌다는 의미 >> 1을 반환(result에 더해짐) */ int x = -1; int ..

[알고리즘] 완전탐색(PICNIC)

algospot.com :: PICNIC 소풍 문제 정보 문제 안드로메다 유치원 익스프레스반에서는 다음 주에 율동공원으로 소풍을 갑니다. 원석 선생님은 소풍 때 학생들을 두 명씩 짝을 지어 행동하게 하려고 합니다. 그런데 서로 www.algospot.com #include #include using namespace std; queue answer; // matrix에 친구 관계, paired에 친구가 있는지 여부 저장 int matrix[10][10]; int paired[10]; int student_num, pair_num; int makePair() { // 짝이 없는 학생이 있다면 idx에 저장하고, 모두 짝이 있다면 1을 반환 int idx = -1; for (int i = 0; i < stu..

[알고리즘] 무식하게 풀기(Brute-Force)

의 해당 단원 밑줄입니다. "공부를 열심히 할수록 복잡하지만 우아한 답안을 만들고 싶은 마음이 커지기 마련이고, 그래서 바로 앞에 보이는 쉽고 간단하며 틀릴 가능성이 낮은 답안을 간과하기 쉽습니다." "컴퓨터의 최대 장점은 결국 속도가 빠르다는 것이니까요. 특히 현실 세계의 문제 중에는 입력의 크기가 작아 컴퓨터가 처리하기에는 별 것 아니지만, 손으로 직접 풀기에는 경우의 수가 너무 많은 경우가 종종 있는데, 이럴 때 완전탐색(가능한 방법을 전부 만들어 보는 알고리즘)은 충분히 빠르면서도 가장 구현하기 쉬운 대안이 됩니다." "우리가 들여다 보는 범위가 작아지면 작아질수록 각 조각들의 형태가 유사해지는 작업들을 많이 볼 수 있습니다. 이런 작업을 구현할 때 유용하게 사용되는 개념이 바로 재귀 호출입니다...

[모두를 위한 딥러닝] 로지스틱 회귀

공부시간(X)을 늘리면 더 좋은 성적(Y)을 받는 것은 통계적으로 합당할 것이다. 1시간 공부한 사람은 20점, 3시간 공부한 사람은 60점, 4시간 공부한 사람은 80점을 받고, 이는 선형적인 관계에 있다고 할 수 있다. 하지만 모든 데이터가 항상 이런 선형적인 관계에 있는 것은 아니다. 로지스틱 회귀 합격과 불합격으로만 결과가 나오는 P/F 상황을 가정해보자. 1시간 ~ 3시간 공부한 사람은 불합격을 받고, 4~6시간 공부한 사람은 합격을 받았다. 합격=1, 불합격=0 으로 봤을 때 다음 상황을 X=[1, 2, 3, 4, 5, 6], Y=[0, 0, 0, 1, 1, 1] 로 말할 수 있고, 이 데이터를 학습에 이용할 수 있을 것이다. 평소처럼 우리가 H(X) = X*W + b로 가정을 한다면 다음과 ..

💻/ML 2020.07.27

[모두를 위한 딥러닝] 텐서플로우 기초, 선형회귀

import tensorflow as tf # 데이터에 랜덤한 값을 하나 넣고, 이름을 'weight', 'bias'로 붙여준 Variable을 생성한다. W = tf.Variable(tf.random_normal([1]), name = 'weight') b = tf.Variable(tf.random_normal([1]), name = 'bias') # 들어올 데이터의 타입은 float32, shape은 아직 정해지지 않은 placeholder를 생성한다. X = tf.placeholder(tf.float32, shape=[None]) Y = tf.placeholder(tf.float32, shape=[None]) 텐서플로우는 '텐서(Tensor)'를 이용해서 그래프를 구성하고, 그래프에 데이터를 넣어 ..

💻/ML 2020.07.26