Menu

문서정보

목차

Multivariable Linear Regress

다중 선형 회귀(Multivariable linear regress)는 설명 변수가 두개 이상인 회귀분석을 의미한다. 단순 회귀 선형의 Hypothesis는 이다. 반면 다중 선형 회귀의 Hypothesis 는 이다. 외에 가 추가 됐기 때문에, w도 하나가 추가됐다.

설명 변수가 n개라면 이 될 것이다. 이 식은 행렬(Matrix)를 이용해서 간단하게 나타낼 수 있다. 설명변수가 3개라면 아래의 행렬로 나타낼 수 있다.

이 행렬은 이 될 것이다. 1 X 3 행벡터 W와 3 X 1 열벡터 X를 행렬곱하고 여기에 절편 b를 더하라는 의미다. 절편은 아래와 같이 행렬의 원소로 넣어 버리면 더 간단하게 표현 할 수 있다.

따라서 hypothesis는 가 된다. 혹은 라고 쓰기도 한다. T는 행렬을 Transpose하라는 의미다. Transpose가 가지는 의미에 대해서 살펴보자.

프로그램에서 1 X 4 행벡터와 4 X 1 열벡터는 그냥 배열일 뿐으로 간단하게 계산 할 수 있다. 하지만 수학자의 입장에서는 두 개의 행렬이 같은 타입인게 인지하기가 편할 것이다. 그러니까 아래와 같이 되는 것이다.

타입이 사람의 입장에서 좀 더 명확하게 인식 할 수 있다. 하지만 4 X 1 행렬과 4 X 1 행렬은 곱을 할 수 없다. 그렇다면 4 X 1 행렬을 1 X 4 행렬로 변환하면 될 것이다. 이 변환과정을 Transpose라고 한다. 이리하여 는 아래와 같이 변환된다.

프로그램 상에서는 상관이 없지만, 문서에 따라서 라고 쓸 수도 있다. 표현만 다를 뿐 두개의 hyposis는 같은 의미다.

Cost function

우리는 단순선형회귀의 Cost function이 아래와 같다는 것을 알 고 있다.

다중 선형 회귀분석은 변수만 더 추가해주면 된다. 나머지는 동일하다. 즉 cost function은 아래와 같을 것이다.

Tensorflow를 이용한 다중 선형 회귀분석

다중 선형 회귀분석이 필요한 예를 들어보자. 종업원의 근무년수가 매출액에 미치는 영향을 조사한다고 가정해보자. 하지만 실제 매출액에는 근무년수 뿐만 아니라, 광고비와 같은 다른 요인들이 크게 영향을 미칠 수 있다. 따라서 이 경우에는 설명변수에 "근무년수"와 "광고비"를 모두 포함하는 다중 회귀 분석을 사용해야 한다.

문제를 단순화 해보자. 아래와 같은 데이터가 있다고 가정해 보자.
x1 x2 y
1 0 1
0 2 2
3 0 3
0 4 4
5 0 5
x1, x2 두 개의 변수가 있으므로 이 데이터에 대한 Hypothesis는 가 된다. 이 Hypothesis를 TensorFlow로 옮기면 된다. TensowFlow는 w1 과 w2를 학습을 해야 하므로, 이들을 Variable로 선언을 해준다. b 단순 선형 모델 그대로 사용하면 된다.
# Hypothesis = W1 * x1_data + W2 * x2_data + b
W1 = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
W2 = tf.Variable(tf.random_uniform([1], -1.0, 1.0))

b = tf.Variable(tf.random_uniform([1], -1.0, 1.0))

TensorFlow 코드다.
import tensorflow as tf
import matplotlib.pyplot as plt

x1_data = [1, 0, 3, 0, 5]
x2_data = [0, 2, 0, 4, 0]
y_data = [1, 2, 3, 4, 5]

W1 = tf.Variable(tf.random_uniform([1], -1, 1))
W2 = tf.Variable(tf.random_uniform([1], -1, 1))

b = tf.Variable(tf.random_uniform([1], -1, 1))

hypothesis = W1 * x1_data + W2 * x2_data + b

cost = tf.reduce_mean(tf.square(hypothesis - y_data))

a = tf.Variable(0.1)  # learning rate, alpha
optimizer = tf.train.GradientDescentOptimizer(a)
train = optimizer.minimize(cost)  # goal is minimize cost

init = tf.initialize_all_variables()

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

for step in xrange(2001):
    sess.run(train)
    if step % 500 == 0:
        print step, sess.run(cost), sess.run(W1), sess.run(W2), sess.run(b)
        plt.plot(x2_data,sess.run(W2) * x2_data + sess.run(b))
        plt.plot(x1_data,'o')
        plt.plot(x2_data, 'o')
        plt.show()
실행 결과
0 0.445281 [ 0.82510382] [ 0.46782768] [ 1.0390929]
500 2.55795e-14 [ 0.99999988] [ 0.99999994] [  2.58046043e-07]
1000 1.42109e-14 [ 1.] [ 0.99999994] [  1.76983818e-07]
1500 1.42109e-14 [ 1.] [ 0.99999994] [  1.76983818e-07]
2000 1.42109e-14 [ 1.] [ 0.99999994] [  1.76983818e-07]
 테스트 결과

다중 회귀 분석에서의 고려 사항

  1. 독립변수간의 상관 관계, 즉 다중공선성(multicollinearity)
  2. 오차항의 자기상관(autocorrelation) 혹은 계열상관(serial correlation)
  3. 종속변수가 독립변수의 변화에 따라 분산을 보이는 이분산성(heteroscedasticity)

참고