#모두를 위한 딥러닝 강좌 lec 04 : Multi-variable linear regression
https://www.youtube.com/watch?v=kPxpJY6fRkY&index=8&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm
이전 시간
Hypothesis ( 01강 : http://aileen93.tistory.com/48 )
Cost function ( 02강 : http://aileen93.tistory.com/49 )
Gradient descent algorithm ( 03강 : http://aileen93.tistory.com/50 )
Multi-variable linear regression
One-feature
x (hour) =입력값 =one-feature |
y (score) = 답 (결과값) = 학습 결데이터 = one-variable |
10 |
90 |
9 |
80 |
3 | 50 |
2 |
60 |
11 | 40 |
- 좋은 feature를 통해서 결과값(y)를 알아내므로 좋은 feautre들을 갖는 것이 중요하다.
- 표 해석 : 10(x값)시간 공부하여 90점(y값)을 받은 친구와 9시간 공부하여 80점을 받은 친구 등으로 해석할 수 있다.
Multi-variable/feature
- H(x1,x2) = w1x1 + w2x2 + w3x3 +b
Multi-variable/Multi-feature도 다르지 않다. 변수(feature)가 여러개로 늘어날 경우를 말한다.
x1 (hours) =입력값 = feature | x2 (attendance) =입력값 = feature | y (score) = 답 (결과값) = 학습 결과 데이터 = variable |
10 | 5 | 90 |
9 | 5 | 80 |
3 | 2 | 50 |
2 | 4 | 60 |
11 | 1 | 40
|
- feature가 여러 개일 경우, multi-variable/feature 라고 부른다.
- 그리고 이 feature가 많을 경우, 당연하게 더 자세하고 정확한 결과를 얻을 수 있다! ( 그렇다고 많은 variable이 있다고 다 좋은 것도 아니다. )
- 표 해석 : 11(x1값)시간을 공부하고도 40점(y값)을 받은 친구는 수업 참석률(x2값)이 1번 밖에 되지 않았음을 우리는 알 수 있다.
( 아까 하나의 feature가 있을 때 보다 더 정확한 결과가 느껴질 것이다. )
결국, feature(변수)가 많아지면 식도 길어지고 계산하기 어려워지니까 고민했었는데 Matrix(행렬)을 통해서 쉽게 계산이 가능하도록 했다.
Matrix
근데, w1x1이던게 행렬의 곱을 하다보니 x1w1으로 순서가 바뀌게 되어서 ( 순서가 바뀌는 것은 아래 Hypothesis using matrix 이미지 참고)
행렬의 곱을 나타낼 경우 H(X) = XW로 표현하게 되었다. (X를 먼저 표현해준다.)
이해가 안간다면 아래 그림을 보면 더 쉽다.
결국, 연산값이 한줄로 표현이 가능하게 된다.
즉, 인스턴스를 각각 계산할 필요가 없이 instance의 수 * W만 행렬로 곱해버린다면 y값이 바로 계산되어서 나오게 된다.
그래서 나온 새로운 Hypothesis
그렇다면, 저 W값을 어떻게 결정할 수 있을까?
...
Transpose
원래 행렬은 (1*4)*(4*1)이 되어야 행렬의 곱을 할 수가 있는데, W행렬을 X 행렬과 같은 모양으로 4*1행렬 * 4*1행렬으로 만들어서 강제로 곱하는 방법이 나오게 된다. (수학자들이 왜 1*4행렬에 4*1행렬을 하니까 보기 싫다며 보기 좋게 만들자고 하면서 나온 방법 Transpose -_-)
=> 나중에 찾아보이소
그래서 우리는 최종적으로 라는 형식으로 사용을 하게 된다.
#multi-variable Linear Regression을 TensorFlow에서 구현하기 실습 04
https://www.youtube.com/watch?v=iEaVR1N8EEk&index=9&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm
# Lab 4 Multi-variable linear regression
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
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.]
# placeholders for a tensor that will be always fed.
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
print('=================> hypothesis :',hypothesis)
# cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize. Need a very small learning rate for this data set
optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-5)
train = optimizer.minimize(cost)
# Launch the graph in a session.
sess = tf.Session()
# Initializes global variables in the graph.
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 % 10 == 0:
print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)
'''
0 Cost: 19614.8
Prediction:
[ 21.69748688 39.10213089 31.82624626 35.14236832 32.55316544]
10 Cost: 14.0682
Prediction:
[ 145.56100464 187.94958496 178.50236511 194.86721802 146.08096313]
...
1990 Cost: 4.9197
Prediction:
[ 148.15084839 186.88632202 179.6293335 195.81796265 144.46044922]
2000 Cost: 4.89449
Prediction:
[ 148.15931702 186.8805542 179.63194275 195.81971741 144.45298767]
'''