선형 회귀 알고리즘 구현, 비용함수, 경사하강법
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를 찾아가게 됨
출처: 텐서플로 입문 _ 잔카를로 자코네
'Data > TensorFlow' 카테고리의 다른 글
MNIST 데이터로 KNN 분류기, 성능 측정 (1) | 2017.04.17 |
---|---|
MNIST 데이터 집합 읽어오기, 이미지로 나타내기 (1) | 2017.04.14 |
편미분 방정식으로 물결 파동 표현하기 (0) | 2017.03.21 |
미분계수구하기, 난수 발생 (0) | 2017.03.16 |
Image 읽고 특정 영역자르기 / 회전 (0) | 2017.03.15 |