머신러닝

3차방정식의 근 구하기 텐서플로우 파이선 코드

coding art 2018. 11. 25. 15:49
728x90

파이선 코딩을 배우는 초보자도 머신 러닝에 한번 도전해 보자.

머신 러닝을 배우려는 초보자들이 가지게 될 의문점들을 하나하나 찾아내어

실제 풀어보고 결과를 확인해볼 수 있도록  완전히 뒷문으로 들어가 시작하는 머신 러닝!


우선 아래 url 을 방문하여 url 로 구성된 본 서의 목차 파일을 무료로 다운로드 받아 살펴보시기 바랍니다.

파이선 코딩 초보자를 위한 톈서플로우∙OpenCV 머신러닝 머리말과 url 목차 파일 다운로드
https://steemit.com/kr/@codingart/pryx1-opencv

noname03.png

_____________________________________________________________________________________________________


3차함수 f(x)=a*x*x*x+b*x*x+c*x+d 를 기술함에 있어 4개의 파라메터 a, b, c, d 가 필요하다. 이와 같은 3차 함수를 학습시키기 위해서 과연 몇 개의 좌표 데이터들이 필요한지는 아직 알려져 있지 않다. 다만 선형회귀에 있어서처럼 좌표 데이터 수가 적정 개수를 넘어 과잉인 상태로 늘어나도 머신 러닝에서는 아무런 문제가 되지는 않는다. 오히려 중요한 사실은 과연 최소한 몇 개의 좌표 데이터가 필요하며 이 데이터들을 어떻게 설정할지의 문제이다.

2차 방정식의 해를 구하는 과정에서 2개의 학습 데이터가 필요했다는 점에 착안하여 3차 함수에서는 3개의 학습 데이터를 사용하기로 하자.

a=1.0, b=2.0, c=-1.0, d=-2.0 인 3차 함수의 해를 구하도록 하자. 
x 축의 [-2.5, 1.5] 구간에서 이 3차 함수는  그림과 같은 형상을 갖는다.

코드의 시작 부분에서 TensorFlow 와 그래프 작성을 위한 pylab를 설치한다.



pylab은 matplotlib 라이브러리의 특수한 부분으로서 함수식이 정의된 경우 편리하게 함수의 그래프를 작도할 수 있다.
3차 함수의 계수 a, b, c, d 의 값을 주자. 이어서 arrange 명령에 의해 x축 상의 구간 {-2.5, 2.3] 을 정의하고 그래프 작도를 위한 간격을 0.01  단위로 정한다.
작도하기 위한 3차함수 s를 설정하고 작도 명령 plot(s,t)를 실행한다. 아울러 x축, y축 라벨과 타이틀을 출력과 grid(True)에 의해 눈금을 표시하도록 설정한 후 show()에 의해서 화면에 출력한다.
cubiceqn_plot_01
앞서 정의된 3차 함수를 사용하여 3개의 학습 데이터를 준비한다.



3차함수의 x 축과의 만나는 점 즉 3차 방정식의 해를 구하기 위해서 3개의 해를 W1,W2,W3를 경사하강법에 의해 수렴시키기 위한 변수로 설정한다.
hypothesis 는 2차 방정식에서의 기법을 확장하여 아래와 같이 3차식 형태로 구성하자.
         hypothesis = (x_train-W1)*(x_train-W2)*(x_train-W3)
cost 함수는 hypothesis 와 y_train 데이터와의 차이 값을 제곱하여 합한 후 평균값을 취하고 learning rate=0.01 로 두어 경사 하강법을 적용한다.
이와 같이 TensorFlow 정식화가 완료되었으면 Session 설정 후 실행하고 결과를 출력한다.



500회 학습 결과 cost 값이  크기로 얻어졌고 W1, W2, W3 가 각각 –1.9999, 0.9999, -1.0000 으로 얻어졌다. 이로서 3개의 학습 데이터를 가지고 3차 함수의 해가 얻어질 수 있음이 확인되었다.




# cubiceqn_regression_01.py

import tensorflow as tf

x_train = [-1.5, 0.0, 2.0]
y_train = [0.625,-2.0, 12.0]

W1 = tf.Variable(tf.random_normal([1]), name='weight1')
W2 = tf.Variable(tf.random_normal([1]), name='weight2')
W3 = tf.Variable(tf.random_normal([1]), name='weight3')

hypothesis = (x_train - W1) * (x_train - W2) * (x_train - W3)

cost = tf.reduce_mean(tf.square(hypothesis - y_train))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())


for step in range(501):
    sess.run(train)
    if step % 100 == 0:
        print(step, sess.run(cost), sess.run(W1), sess.run(W2), sess.run(W3)