머신러닝

3 연립 비선형 방정식 tensorFlow 수치해 파이선 코드

coding art 2018. 11. 25. 17:11
728x90

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

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

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

noname03.png

_____________________________________________________________________________________________________________________________


이와 같이 복잡한 형태의 연립된 비선형 방정식 시스템을 대상으로 학습을 시키기 쉽지 않으므로 다음과 같이 단순히 제곱의 항으로 hypothesis를 설정하자.

이 hypothesis는 각각 괄호의 제곱의 합으로 이루어지므로 항상 0 이상의 값을 가지게 되며 0이 되는 경우는 3개 미지수를 가지는 비선형 3원 연립 방정식이 된다. 경사 하강법을 적용하여 hypothesis가 최소가 되는 즉 0이 되는 x, y , z 값을 결정하도록 한다.
 hypothesis를 이용하여 경사 하강법을 적용하기 위해서는 미지수  x, y, z의 초기 출발 값과 learning rate 값을 지정해 주어야 할 필요가 있다. 여기서는 난수 random_uniform()을 사용하도록 하여 구간을 아래와 같이 설정한다.
 
아울러 learning rate = 0.000001을 적용하여 hypothesis를 사용한 cost  함수 계산 결과를 참조하자.



5.000ghl 게산 결과 cost  함수의 값이 2.12 이므로 좀 더 수렴을 시켜야 할 필요가 있다. 따라서 weight들 즉 x, y, z 값들의 범위를 아래와 같이 바꾸고 learning rate = 0.0001로 재조정하여 다시 실행 시키도록 한다.



2차 계산을 통해 cost  함수가  정도로 충분히 작아졌으나  정도로 보다 정밀하게 cost 함수를 최소화 시킬 필요가 있어 보인다. 따라서 weight 값들의 범위를 아래와 같이 특히 x값의 난수 범위를 0.7로 다시 바꾸고 learning rate =0.0001로 재조정하여 다시 실행 시키도록 한다.



최종적으로 cost 함수 값이  크기로 얻어졌다. 따라서 이 비선형 3원 연립 방정식의 해는 x = 0.8288, y = -0.05129, z = -0.5246  으로 주어진다.

TensorFlow 는 adative 하게 난수의 범위와 learning  rate 의 값을 바꾸어 줄 수 없으므로 몇 번의 실행을 통해서 이 작업을 수행해 주면 된다.


# nonln3eqn_regression_01.py

import tensorflow as tf


W1 = tf.Variable(tf.random_uniform([1],0.7, 0.9, dtype = tf.float32, name='weight1'))
W2 = tf.Variable(tf.random_uniform([1],0.0, +0.1, dtype = tf.float32, name='weight2'))
W3 = tf.Variable(tf.random_uniform([1], -0.55, -0.5, dtype = tf.float32, name='weight3'))

#W1 = tf.Variable(tf.random_uniform([1],0.0, +0.1, dtype = tf.float32, name='weight1'))
#W2 = tf.Variable(tf.random_uniform([1],0.0, +0.1, dtype = tf.float32, name='weight2'))
#W3 = tf.Variable(tf.random_uniform([1],0.0, +0.1, dtype = tf.float32, name='weight3'))

hypothesis = (3.*W1-tf.cos(W2*W3)-1.5)**2 + (4.*W1*W1-625.*W2*W2+2.0*W2-1.)**2 + (tf.exp(-W1*W2)+20.*W3 + 9.472)**2
cost = tf.reduce_mean(tf.square(hypothesis))

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.0001)
#optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.000001)
train = optimizer.minimize(cost)

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


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