示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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}')
示例#5
0

# 모든 점들이 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}')