본문 바로가기

Machine, Deep Learning/Machine, Deep Learning 실습

선형 회귀 구현하기

반응형
SMALL

선형 회귀는 종속 변수 y와 한 개 이상의 독립 변수 X와의 선형 상관 관계를 모델링하는 회귀분석 기법을 말합니다.

 

이번 시간에는 y와 x가 주어졌을 때, 'y = ax + b'라는 형태의 직선을 회귀식으로 하는 단순한 선형 회귀(Linear Regression)를 파이썬을 통해 구현해봅시다.


선형 회귀의 절차

  1. x라는 값이 입력되면 'ax+b'라는 계산식을 통해 값을 산출하는 예측 함수를 정의합니다.
  2. 예측 함수를 통해 예측값과 실제값 y간의 차이를 계산합니다.
  3. a와 b를 업데이트 하는 규칙을 정의하고 이를 바탕으로 a와 b의 값을 조정합니다.
  4. 위의 과정을 특정 반복횟수만큼 반복합니다.
  5. 반복적으로 수정된 a와 b를 바탕으로 'y=ax+b'라는 회귀식을 정의합니다.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use("Agg")
# 학습률(learning rate)를 설정한다.(권장: 0.0001~0.01)
learning_rate = 0.005
# 반복 횟수(iteration)를 설정한다.(자연수)
iteration = 100
def prediction(a, b, x):
    # 넘파이 배열 a,b,x를 받아서 'x*(transposed)a + b'를 계산하는 식을 만든다.
    equation = x * a.T + b
    
    return equation
    
def update_ab(a,b,x,error,lr):
    # a를 업데이트하는 규칙을 정의한다.
    delta_a = -(lr*(2/len(error))*(np.dot(x.T, error)))
    # b를 업데이트하는 규칙을 정의한다.
    delta_b = -(lr*(2/len(error))*np.sum(error))
    
    return delta_a, delta_b
    
def gradient_descent(x, y, iters):
    #초기값 a= 0, a=0
    a = np.zeros((1,1))
    b = np.zeros((1,1))
    
    for i in range(iters):
        #실제 값 y와 예측 값의 차이를 계산하여 error를 정의한다.
        error = y - prediction(a, b, x)
        a_delta, b_delta = update_ab(a,b,x,error,lr=learning_rate)
        a -= a_delta
        b -= b_delta
        
    return a, b

def plotting_graph(x,y,a,b):
    y_pred=a[0,0]*x+b
    plt.scatter(x, y)
    plt.plot(x, y_pred)
    plt.savefig("test.png")
    eu.send_image("test.png")

def main():

    x = 5*np.random.rand(100,1)
    y = 3*x + 5*np.random.rand(100,1)
    
    a, b = gradient_descent(x,y,iters=iteration)
    
    print("a:",a, "b:",b)
    plotting_graph(x,y,a,b)
    
main()
    

반응형
LIST