본문 바로가기
  • Let's go grab a data
Data/TensorFlow

선형 회귀 알고리즘 구현, 비용함수, 경사하강법

by pub-lican-ai 2017. 4. 14.
반응형

선형 회귀 알고리즘 구현, 비용함수, 경사하강법


import numpy as np

number_of_points = 500;


x_point=[]

y_point=[]

a=0.22  #선형관계 지수

b=0.78


for i in range(number_of_points):

    x=np.random.normal(0.0,0.5)

    y=a*x+b+np.random.normal(0.0,0.1)

    x_point.append([x]);

    y_point.append([y]);


import matplotlib.pyplot as plt

plt.plot(x_point,y_point,'o',label='Input Data')

plt.legend()

plt.show()


#비용함수와 경사하강법

import tensorflow as tf

A = tf.Variable(tf.random_uniform([1],-1.0,1.0));  #기울기 A 추정 초기값은 -1에서 1사이의 임의의 값

b = tf.Variable(tf.zeros([1]))

#변수 y와 변수 x의 선형관계 수식 정의

y = A * x_point + b


#비용 함수 cost function 정의  해당 비용함수는 예측 값이 실제의 값과 어느 정도 차이가 있는지 연산

#평균 제곱근 오차 기법 mean square error 예측의 평균값이 실제값으로부터 얼마나 떨어져 있는지 분산

#이 값이 작을 수록 지수 A와 b를 실제와 가깝게 예측한 것

cost_function = tf.reduce_mean(tf.square(y-y_point))

#경사하강법 Gradient Descent 

#경사 하강법은 전역 최소값이 아닌 지역 최소값에 머무르게 된다. 

#0.5는 학습률 : 최적의 값에 도달하기 위해 경사를 얼마나 급격하게 적용할지, 값이 크면 최적의 해를 지나칠 수 있고, 작으면 너무 많은 반복 필요

optimizer = tf.train.GradientDescentOptimizer(0.5)  

#cost_function의 값을 최소화한 결과를 train에 담기 minimize 비용 최소화 함수

train = optimizer.minimize(cost_function) 

#변수 초기화

model = tf.global_variables_initializer()


with tf.Session() as session:

    session.run(model)

    for step in range(0,20):

        session.run(train)

        if(step%5==0):

            plt.plot(x_point,y_point,'o',label='step={}'.format(step))

            plt.plot(x_point,session.run(A)*x_point+session.run(b))

            plt.legend()

            plt.show()

print(session.run(A),session.run(b))

결과는 초기 랜덤하게 A와 b를 계수로 가지는 직선에서 점차 데이터의 실제 y=Ax+b를 찾아가게 됨

A[-0.43602419] b[ 0.79499543]
A[ 0.07122682] b[ 0.78450501]
A[ 0.18706831] b[ 0.78216481]
A[ 0.21352291] b[ 0.7816304]


출처: 텐서플로 입문 _ 잔카를로 자코네

반응형