[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27
[코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28
[코드로 이해하는 딥러닝 2] - Tensorflow 변수선언 https://limitsinx.tistory.com/29
[코드로 이해하는 딥러닝 3] - Tensorflow placeholder변수 https://limitsinx.tistory.com/30
[코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31
※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다
[코드 전문]
이 전글에서는 (1,1), (2,2)를 지나는 직선을 "선형회귀(Linear Regression)"을 통해
구하는 방법에 대해 정리해보았습니다.
다중선형회귀(Multiple Linear Regression)은 선형회귀와 동일한데, 2차원에서 N차원으로 늘려보는 차이 뿐입니다.
(1,1) (2,2)를 지나는 Y=X라는 x,y좌표 2차원상의 직선을 구해보았다면,
이번에는 (1,2,3,4),(10,5,6,11)을 지나는 직선을 찾아보는것입니다. (4차원)
수식 또한, y= W1*x1 + W2*x2 + W3*x3 + b로, 기존의 Y=Wx + b보다 변수의 갯수가 늘어나게 되겠죠!
이게 끝입니다.
복잡한 수학적 공식을 통한 최적화, 원하는 결과값 찾기는 컴퓨터가 알아서 다 해주니까요 :)
이번 문제는,
"그래서 회귀(Regression)을 왜하는건데? , Weighting과 bias가 뭔데?"
에 대한 답변으로, 실생활 예시를 통해 정리해보겠습니다.
현재 우리는 민호,동수,진호,경진,미희 총 5명의 데이터를 가지고 있습니다.
그들 각각의 국어/수학/영어 점수가 있으며, 이를 통해 어떠한 보정을 통해 얻어낸 최종 Score가 있는데요
이때 현준이가 표와 같은 국영수 점수를 받았을때 최종 Score는 무엇일까요??
가지고 있는 학습데이터를 통해 y= W1*x1 + W2*x2 + W3*x3 + b 의 W1, W2, W3 , b를 모두 찾아내고
현준이의 국영수 점수를 수식에 대입하면 최종 Score가 나오게됩니다.
그렇게 하자면, 우린 W1 ,W2, W3, b를 알아야하죠!
이것을 Gradient Descent , Cost optimize를 통해 얻어 내는것이 머신러닝입니다!
참고 : [코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) https://limitsinx.tistory.com/31
[코드 분석-1]
x1_data는 국어점수,
x2_data는 수학점수,
x3_data는 영어점수
W1,W2,W3,b 변수를 선언해주었고, x1~x3,y는 placeholder로 저장
Hypothesis(y추정값)= W1*x1 + W2*x2 + W3*x3 + b
※이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다
[코드 분석-2]
cost로 내가 추정한 값(Hypothesis)와 실제값(y)의 차이를 제곱하여 수식을 만들어주고,
cost function은 아래로 볼록한 이차함수가 되므로
미분했을때 0이 나오는 지점을 cost=0(최소) 찾아가며 W1,W2,W3,b를 하나씩 바꾸어가는 코드입니다.
해당 코드는 2001번 학습하도록 프로그래밍 했습니다.
이 부분의 Weighting과 bias값이 어떻게 나오는지 보기위해 코드를 아래와 같이 살짝 바꾸어보았습니다.
[코드 분석-2-1]
[결과값(2000번 학습)]
2000번 학습한 결과
W1 = 1.4955114
W2 = 1.0251813
W3 = -0.4571079
b= -3.3745909가 얻어졌습니다.
이를통해 유추해본 현준이의 Score는 약 194점이네요
Summary
5명의 국어 영어 수학 점수를 통해/ 다른 한명의 최종점수를 예측하는 방법에 대해 정리해보았습니다.
이것을 머신러닝 용어로 표현해보면, "5개의 training data로 3개의 feature에 대한 hypothesis를 정리하여
test set의 점수를 예측해본다" 라고 할 수 있습니다.
개인적으로, 회귀(Regression)는 머신러닝은 아직 아니고, "수치해석에서 왜 머신러닝으로 나아가게 되었는가?" 에 대한 교두보 역할을 할 수 있는 부분이라 생각합니다.
즉, 이부분을 잘 이해해야 앞으로 머신러닝이 돌아가는 방법에 대해 충분히 이해할 수 있다고 생각합니다.
[코드 공유]
import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior()
x1_data = [73., 93., 89., 96., 73.]
x2_data = [80., 88., 91., 98., 66.]
x3_data = [75., 93., 90., 100., 70.]
y_data = [152., 185., 180., 196., 142.]
x1 = tf.placeholder(tf.float32)
x2 = tf.placeholder(tf.float32)
x3 = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
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')
b = tf.Variable(tf.random_normal([1]),name = 'bias')
hypothesis = x1 * w1 + x2 * w2 + x3 * w3 + b
cost = tf.reduce_mean(tf.square(hypothesis - Y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for step in range(2001) :
cost_val, hy_val, _ = sess.run([cost, hypothesis, train],
feed_dict = { x1 : x1_data, x2 : x2_data, x3 : x3_data, Y : y_data})
if step % 1000 == 0 :
print(step, "Cost : ",cost_val,"\nPrediction:\n",hy_val,
"\nWeight,bias :\n",sess.run(w1),sess.run(w2),sess.run(w3),sess.run(b))
'DeepLearning Framework & Coding > Tensorflow 1.X' 카테고리의 다른 글
[코드로 이해하는 딥러닝 7] - .txt(.csv)파일 불러오기 (0) | 2020.12.20 |
---|---|
[코드로 이해하는 딥러닝 6] - 회귀(Linear Regression)에 대한 다른 접근 (0) | 2020.12.19 |
[코드로 이해하는 딥러닝 4] - 선형회귀(Linear Regression) (6) | 2020.12.17 |
[코드로 이해하는 딥러닝 3] - Tensorflow placeholder변수 (0) | 2020.12.16 |
[코드로 이해하는 딥러닝 2] - Tensorflow 변수선언 (0) | 2020.12.15 |
댓글