이번 포스트에서는 지난번 Linear regression에 이어서, 하나의 변수가 아니라 여러개의 multi-varaible을 사용하는 방법에 대해서 포스트하겠습니다.
우선 포스트를 시작하기 전에 지난번에 올렸던 내용을 복습해보겠습니다.
Linear regression을 설계하기 위해선 세가지가 필요합니다.
우선 Hypothesis가 있는데요, Linear regression에서는 H(x) = Wx + b로 가설을 세우게됩니다.
다음으로는 이 가설이 얼마나 맞는지에 대해서 판단하는 Cost function이 필요합니다.
마지막으로는 이 Cost를 최적화하는 Gradient Descent Algorithm이 필요합니다.
여기까지에 대해서 완벽히 이해하셨으면, 이번 포스트 내용에 대한 기초적인 이해는 충분하다고 할 수 있습니다.
여러개의 인풋(아래의 예에서는 3개의 인풋)에 대해서 학습하는 과정에 대해서 알아보겠습니다.
기말고사 점수에 대해서 quiz 1과 quiz 2 그리고 중간고사 점수를 사용하여 예측을 할 수 있을까에 대한 고민이 있습니다.
이런 경우에는 어떻게 해야할까요?
이 전의 한개의 인풋에 대해서는
라는 가설을 세웠습니다.
이것을 확장하여 세개의 인풋에 대한 가설을 세워보면
라고 확장할 수 있습니다.
또 이것은 n개의 인풋에 대하여
라고 확장할 수 있습니다.
이 가설을 matrix를 통해서 표현하면
과 같이 표현할 수 있습니다.
위의 데이터에서 한 행에 대해서 우리는 instance라고 부릅니다.
행렬에서는 이 인스턴스들을 전부 연산할 수 있습니다.
따라서 matrix를 썼을 때의 좋은 점은 모든 인스턴스를 행렬화하여 W를 곱하게 되면
원하는 모든 결과를 얻을 수 있다는 점입니다.
다른 행렬의 성질같은 경우에는 다른 포스트에서 다루도록 하겠습니다.
우선 우리는 이와같은 과정에서 여러 인풋에 대해서 새로운 가설을 세우는 과정을 진행하였습니다.
Cost function과 이 최적화 알고리즘은 이전의 한개의 인풋에 대한 방법과 동일합니다.
즉 여러개 인풋을 사용하는 Linear Regression은 가설의 부분에서 차이가 크고, 다른 부분은 대동소이합니다.
Tensorflow
예시1)
import tensorflow as tf
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
# 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)
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
예시1)의 소스코드는 이론에서 말했던 matrix의 개념을 사용한 것은 아닙니다.
따라서 소스코드가 상당히 복잡한데요, 이런 방법은 거의 사용되지 않습니다.
예시2)
import tensorflow as tf
x_data = [[73., 80., 75.], [93., 88., 93.],
[89., 91., 90.], [96., 98., 100.], [73., 66., 70.]]
y_data = [[152.], [185.], [180.], [196.], [142.]]
# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 3])
Y = tf.placeholder(tf.float32, shape=[None, 1])
W = tf.Variable(tf.random_normal([3, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
# Hypothesis
hypothesis = tf.matmul(X, W) + b
# Simplified cost/loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
# Minimize
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={X: x_data, Y: y_data})
if step % 10 == 0:
print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)
예시2)의 소스코드는 matrix의 개념을 사용하여 소스코드를 구현한 것입니다.
예시1)의 소스코드보다 훨씬 구조가 간단한 것을 눈으로 확인할 수 있습니다.
'AI > Lecture notes' 카테고리의 다른 글
[ML lec 06] Softmax Regression (0) | 2017.07.21 |
---|---|
[ML lec 05] Logistic Classification (0) | 2017.07.19 |
[ML lec 03] Linear Regression의 cost 최소화 알고리즘의 원리 설명 (0) | 2017.07.15 |
[ML lec 02] Linear Regression (1) | 2017.07.06 |
[ML lec 01] 기본적인 머신러닝의 용어와 개념 설명 (0) | 2017.07.04 |