머신러닝

1-9? TensorFlow 모듈응용 1차 방정식의 해 구하기

coding art 2018. 2. 21. 18:50
728x90





1차 방정식의 해를 구하는 문제는 2개의 1차 방정식의 교점을 구하는 문제의 특수한 경우라고 볼 수 있다. 즉 2개의 1차 방정식 중 1개가 x 축이 되는 경우이다. 즉 교점의 좌표를 (x0, y0)라고 한다면 x축과의 교점은  (x0, 0) 이 된다. 따라서 아주 간단한 기하학적인 아이디어를 사용하여 least square 기법을 적용해 보기로 한다.


(x,y)평면에서 1차 방정식 Ax+By+C=0 과 x축 상의 1점 P(x0, 0) 와 최단 직선거리는  그림의 d 로 표현된다.

따라서 1차 방정식의 해는 (x,y) 평면상에서 x축과 교차하는 직선의 교점을
찾는 문제가 되며, 이 최소 직선거리 d 의 제곱을 cost 함수로 선택하여 그 값을 최소화 하도록 하자.

머신 러닝을 시작하기 위한 초기 조건은 y=0 인 x축 상에 위치한 1점 P (x0, 0) 의 값을 TensorFlow 의 난수 명령을 사용하여 임의의 값 즉 W에서 시작하기로 한다. 여기에서 사용하는 W 는 선형회귀 분석에서 사용하는 weight W 와는 개념이 다르며 단순하게 W는 미지의 해 즉 x 좌표, x0를 뜻한다고 보면 된다.

 

d의 제곱이 위와 같이 표현되면 TensorFlow 모듈을 사용하는 linear regression  예제 코드를 쉽게 변경하여 사용할 수 있음을 알 수 있다. 이 예제에서는 특별히 바이어스 b = 0 인 경우이다.
linear regression 예제 코드에서 hypothesis 와 cost 는 다음과 같이 코딩되었음에 착안하자.
                  hypothesis = x_train * W + b
                 

여기서 x_train 과 y_train 은 각각 리스트 데이터 구조를 가진다. 이 코딩을 참조하여 다음과 같이 코드 형태를 수정하자.

   hypothesis = A_train * W
  

여기서 학습 데이터인 A_train, B_train, C_train 은 다음과 같이 리스트 데이터 구조로 주어진다.


A=1, B=1, C=-1 인 수치 예제를 고려하자. 이 문제는 다음과 같이 2개의 직선의 방정식을 의미한다. 연립하여 풀면 해는 (1, 0)이 된다.
   x + y – 1 = 0,
       y  = 0

1/√2 = 0.707 로 두면 리스트 데이터는 다음과 같이 A_train = [ 0.707 ], B_train = [ 0.707 ], C-train = [ 0.707] 으로 설정 된다. learning rate= 0.01에 1000회 루프를 주어 계산된 결과로서 W = 1.0 즉 해는 x = 1.0 임을 알 수 있다.



이 예제에서 hypothesis 구성이 linear regression 과 다르다는 점에 유의한다. 특히 앞으로 다루게 될 수치해석 문제들에 있어서도 hypothesis 구성이 항상 linear regression 과 달라진다는 점에 유의해야 하며, 새로운 문제의 연습을 통해 적절한 형태의 hypothesis를 스스로 구성하기 위한 노력이 필요하다.





linear_reg_1wn1chaeqn_01



#linear_reg_1wn1chaeqn_01.py


import tensorflow as tf

tf.set_random_seed(777)  # reproducibility


a_train = [0.707]

b_train = [0.707]

c_train = [0.707]


W = tf.Variable(tf.random_normal([1]), name='weight')

b = tf.Variable(tf.random_normal([1]), name='bias')


hypothesis = a_train * W 

cost = tf.reduce_mean(tf.square(hypothesis - c_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(W))

#