본문 바로가기
Machine Learning/Basic Machine Learning

[ML/DL] 선형 회귀 분석 및 비용 최소화 방법(2)

by Sin_ 2021. 10. 29.
728x90

안녕하세요 뚜디 입니다 :D


선형 회귀 분석 및 비용 최소화 방법(2)


[ML/DL] 선형 회귀 분석 및 비용 최소화 방법 (tistory.com)

 

[ML/DL] 선형 회귀 분석 및 비용 최소화 방법

안녕하세요 뚜디 입니다 :) 선형 회귀 분석 및 비용 최소화 방법 이번 포스팅에서는 cost를 최소화하는 구체적인 방법과 알고리즘을 조금 더 깊이 있게 알아봅시다. 1. 가설(Hypothesis)함수와 비용(co

sindh718.tistory.com

이번 포스팅에서는 비용 최소화, Cost Minimize하는 것을 TensorFlow로 어떻게 구현하는지 알아보도록 하겠습니다.
이전 선형회귀 분석 및 비용 최소화 방법 포스팅을 보지않으셨다면 먼저 위 링크를 클릭해 확인하고 보시는것을 추천드립니다.

간략화된 가설함수에 대해 다시 한번 간략하게 살펴보고 넘어가도록 합니다.
간략화된 가설함수란, H(x) = Wx + b -> H(x) = Wx 즉, b없이 간략하게 Wx로 표현했고,
비용함수 역시 b가 없는 간략화된 수식으로 재정의를 했습니다.

 

1. 비용 함수(Cost Function)을 Python으로 구현
import numpy as np

x = np.array([1,2,3])
y = np.array([1,2,3])

def cost_func(w, x, y):
    c = 0
    for i in range(len(x)):
        c == (w * x[i] - y[i]) ** 2
        return c / len(x)

for feed_w in np.linspace(-3, 5, num = 15):
    curr_cost = cost_func(feed_w, x, y)
    print("{:6.3f} | {:10.5f}". format(feed_w, curr_cost))

이 Cost를 그대로 파이썬 코드로 한번 옯겨보도록 하겠습니다.
데이터는 아주 간단하게 x, y [1, 2, 3] 동일하게 준비를 하고, cost_func을 통해 함수를 구현합니다.
c == (w * x[i] - y[i]) ** 2 : (wx - y)^2

2. 비용 함수(Cost Function)을 TensorFlow으로 구현
import numpy as np
import tensorflow as tf

x = np.array([1,2,3])
y = np.array([1,2,3])

def cost_func(w, x, y):
    hypothesis = x * w
    return tf.reduce_mean(tf.square(hypothesis - y))

w_values = np.linspace(-3, 5, num = 15)
cost_values = []

for feed_w in w_values:
    curr_cost = cost_func(feed_w, x, y)
    cost_values.append(curr_cost)
    print("{:6.3f} | {:10.5f}". format(feed_w, curr_cost))
비용 함수를 TensorFlow으로 구현을 하면 Python으로 구현하는것과 차이는 없습니다.
단, TensorFlow에서 제공해주는 함수에 대해 알아보도록 하겠습니다.

hypothesis = x * w : 가상함수 선언
tf.reduce_mean(tf.square(hypothesis - y))
   -> tf.square(hypothesis - y) : 가상함수에서 y를 빼고, 그것을 제곱
   -> tf.reduce_mean(...) : 평균

 

3. 경사 하강법(Gradient descent)를 Tensorflow로 구현하기

※ 경사 하강법(Gradient descent) TensorFlow로 구현

alpha = 0.01 # learing rate
gradient = tf.reduce_mean(tf.multiply(tf.multiply(w, x) - y, x))
descent = w - tf.multiply(alpha, gradient)
w.assign(descent)

※ 경사 하강법(Gradient descent) TensorFlow로 구현 예제

import tensorflow as tf
import numpy as np

tf.compat.v1.set_random_seed(0) # for reproducibility

x_data = [1., 2., 3., 4.]
y_data = [1., 3., 5., 7.]

w = tf.Variable(tf.random.normal([1], -100, 100))

for step in range(300):
    hypothesis = w * x
    cost = tf.reduce_mean(tf.square(hypothesis - y))

    alpha = 0.01 #learing rate
    gradient = tf.reduce_mean(tf.multiply(tf.multiply(w, x) - y, x))
    descent = w - tf.multiply(alpha, gradient)
    w.assign(descent)
    
    if step % 10 == 0:
        print('{:5} | {:10.4f} | {:10.6f}'.format(step, cost.numpy(), w.numpy()[0]))

결과 값은 Step | cost | w 로 출력되며, 값을 살펴보게되면,
Cost값은 처음에 굉장히 큰 값을 가지고 있다가 점점 급속하게 줄어 0 으로 수렴하는것을 볼 수 있고,
w(가설함수) 값은 -100~100 사이 랜덤 값에서 시작하여 1(특정한 값)로 수렴하는것을 볼 수 있습니다.
import tensorflow as tf
import numpy as np

tf.compat.v1.set_random_seed(0) # for reproducibility

x_data = [1., 2., 3., 4.]
y_data = [1., 3., 5., 7.]

w = tf.Variable([5.0])

for step in range(300):
    hypothesis = w * x
    cost = tf.reduce_mean(tf.square(hypothesis - y))

    alpha = 0.01 #learing rate
    gradient = tf.reduce_mean(tf.multiply(tf.multiply(w, x) - y, x))
    descent = w - tf.multiply(alpha, gradient)
    w.assign(descent)
    
    if step % 10 == 0:
        print('{:5} | {:10.4f} | {:10.6f}'.format(step, cost.numpy(), w.numpy()[0]))
w값을 랜덤 값이 아닌, 특정 값을 주어도 결과는 동일하게 나타나는 것을 확인할 수 있습니다.

결과를 보면, w 값은 어떤 값이던 상관없이(-3 이던 5 이던) Cost 는 0 으로 w는 1(특정한 값 : 현재 여기서는 '1')로 수렴하는 것을 확인할 수 있습니다.
728x90