def mini_batch_gd(dataset, epochs=5000, learning_rate=0.001, batch_size=1, shuffle=True): dataset = dataset.copy() theta = [random.randint(-10, 10), random.randint(-10, 10)] print(f'theta 초기값: {theta}') for epoch in range(epochs): if shuffle: random.shuffle(dataset) mini_batch = minibatches(dataset, batch_size, shuffle) for batch in mini_batch: gradients = [linear_gradient(x, y, theta) for x, y in batch] gradient = vector_mean(gradients) theta = gradient_step(theta, gradient, -learning_rate) return theta
def mini_batch_gd(dataset, epochs=5000, learning_rate=0.001, batch_size=1, shuffle=True): dataset = dataset.copy() # 원본 데이터를 복사해서 사용 # 경사 하강법으로 찾으려고 하는 직선의 기울기와 절편의 초깃값 theta = [random.randint(-10, 10), random.randint(-10, 10)] print('theta 초깃값:', theta) for epoch in range(epochs): # epochs 회수만큼 반복 if shuffle: random.shuffle(dataset) # 무작위로 순서를 섞음 mini_batch = minibatches(dataset, batch_size, shuffle) for batch in mini_batch: # 미니 배치 크기만큼 반복 # 미니 배치 안의 점들에 대해서 gradient들을 계산 gradients = [linear_gradient(x, y, theta) for x, y in batch] # gradient들의 평균을 계산 gradient = vector_mean(gradients) # gradient를 사용해서 파라미터 theta를 변경 theta = gradient_step(theta, gradient, -learning_rate) return theta
def mini_batch_gd(dataset, epochs, # 몇번 반복할 것인가 learning_rates = 0.001, # 어떤 비율 만큼씩 이동시킬 것 인가 # in terms of returned value, 0.001 > 0.01 (the prior one was better than the other) batch_size = 1, # 기본값 1, 점 1개에 대해서 센터값 다시 계산하고 반복 (스토케스틱이 기본값이다) shuffle = True): # 셔플 -> 에포크를 다시 줄 때마다 계산 할 것인지 여부 dataset = dataset.copy() # 원본 데이터를 복사해서 사용 # AUNQUE LO MEZCLAMOS, LOS DATOS DE ORIGINAL VERSION SE QUEDA # 찾으려고하는 직선의 기울기와 절편의 초깃값 theta = [random.randint(-10,10), random.randint(-10,10)] print('theta 초깃값:', theta) for epoch in range(epochs): # epoch 회수만큼 반복 if shuffle: random.shuffle(dataset) # 무작위로 순서를 섞음 mini_batch = minibatches(dataset, batch_size, shuffle) # dataset (that has the values of x & y) for batch in mini_batch: # 미니 배치 크기만큼 반복 # 미니 배치 안의 점들에 대해서 gradient 들을 계산 gradients = [linear_gradient(x,y,theta) for x, y in batch] # gradient 들의 평균을 계산 gradient = vector_mean(gradients) # gradient를 사용해서 파라미터 theta 변경 theta = gradient_step(theta, gradient, -learning_rates) # 최솟값을 찾는 것이기 때문에 learning rates 에 마이너스 값을 줬다 return theta
if __name__ == '__main__': print('=== 확률적 경사 하강법 ===') # 임의의 파라미터 초깃값 theta = [1, 1] # [기울기, 절편], y = x + 1 # 파라미터의 값을 변경할 때 사용할 가중치(학습률, learning rate) step = 0.001 # next_x = init_x + step * gradient for epoch in range(200): # 임의의 회수(epoch)만큼 반복 random.shuffle(dataset) # 데이터 세트를 랜덤하게 섞음 # 각각의 epoch마다 # 데이터 세트에서 샘플(x, y)를 추출 for x, y in dataset: # 각 점에서 gradient를 계산 gradient = linear_gradient(x, y, theta) # 파라미터 theta(직선의 기울기와 절편)를 변경 theta = gradient_step(theta, gradient, -step) if (epoch + 1) % 10 == 0: print(f'{epoch}: {theta}') print('\n=== 배치 경사 하강법 ===') step = 0.001 theta = [1, 1] # 임의의 값으로 [기울기, 절편] 설정 for epoch in range(5000): # 모든 샘플에서의 gradient를 계산 gradients = [linear_gradient(x, y, theta) for x, y in dataset] # gradients의 평균을 계산 gradient = vector_mean(gradients) # 파라미터 theta(기울기, 절편)을 변경 theta = gradient_step(theta, gradient, -step) if (epoch + 1) % 100 == 0: print(f'{epoch}: {theta}')
# 모든 점들이 y=20*x+5에 있음-> 과연 기울기 20, 절편5를 찾을 수 있을까? dataset = [(x, 20 * x + 5) for x in range(-50, 51)] if __name__ == '__main__': print('\n=== 확률적 경사 하강법 ===') theta = [1, 1] # 임의의 파라미터 초기값[기울기, y절편] : y = x + 1 step = 0.001 # 파라미터의 값을 변경할 때 사용할 가중치(학습률) for epoch in range(200): # 임의의 횟수(epoch)만큼 반복 random.shuffle(dataset) # data set을 랜덤하게 섞음 for x, y in dataset: # 각각의 epoch마다 샘플(x, y) 추출해서 gradient = linear_gradient(x, y, theta) # 각 점에서 gradient 계산 theta = gradient_step(theta, gradient, step=-step) # 파라미터 theta변경(move) if (epoch + 1) % 10 == 0: # 200번 epoch하고 있는데, 10번마다만 print print(f'{epoch}: {theta}') print('\n=== 배치 경사 하강법 ===') step = 0.001 theta = [1, 1] # 임의의 값으로 [기울기, 절편] 설정 for epoch in range(5000): # 모든 샘플에서의 gradient를 계산 gradients = [linear_gradient(x, y, theta) for x, y in dataset] # gradients의 평균을 계산 gradient = vector_mean(gradients) # 파라미터 theta(기울기, 절편)을 변경 theta = gradient_step(theta, gradient, -step) if (epoch + 1) % 100 == 0: print(f'{epoch}: {theta}')