#!/usr/bin/env python3


Inverse Matrix Method


일반적인 linear regression의 식은 다음과 같이 쓸 수있습니다.

$ y = ax + b $, 그러나 이 식을 행렬로 확장하면 $AX = Y$로 쓸 수 있습니다.

$$X=A^{-1}(A^{-T}A^{T})Y$$

$$X=(A^{T}A)^{-1}A^{T}Y$$


$$A = \left[ {\begin{array}{cc}   x_{ 11 } & x_{ 12 } & x_{ 13 } & \cdots  & 1 \\  x_{ 21 } & x_{ 22 } & x_{ 23 } & \cdots  & 1 \\  \vdots&\vdots   &\vdots  &\ddots   & \vdots \\x_{ 31 } & x_{ 32 } & x_{ 33 } & \cdots  & 1 \end{array} } \right]$$


$$ point_{i}=(y_{i}, x_{i1}, x_{i2}, \cdots, x_{iF})$$


간단한 데이터를 만들어 이를 구현해보겠습니다.

import tensorflow as tf

import numpy as np


x_vals = np.linspace(0, 10, 100).reshape(-1, 1)

y_vals = x_vals + np.random.normal(0, 1, size=100).reshape(-1, 1)

ones = np.ones(100).reshape(-1, 1)


A = np.c_[x_vals, ones]


A_tsr = tf.constant(A, dtype=tf.float32)

y_tsr = tf.convert_to_tensor(y_vals, dtype=tf.float32)


init = tf.global_variables_initializer()

with tf.Session() as sess:

    init.run()

    tA_A = tf.matmul(tf.transpose(A_tsr), A_tsr)

    tA_A_inv = tf.matrix_inverse(tA_A)

    prod = tf.matmul(tA_A_inv, tf.transpose(A_tsr))

    sol = tf.matmul(prod, y_tsr)

    solution = sol.eval()


slope = solution[0][0]

cept = solution[1][0]


print('slope :{:.3f}'.format(slope))

# slope :1.000


print('intercept :{:.3f}'.format(cept))

# intercept :0.012



이 결과를 시각화하는 코드는 다음과 같습니다.

import matplotlib.pyplot as plt


reg_params = []

for i in x_vals.ravel():

    poly = slope*i + cept

    reg_params.append(poly)


plt.scatter(x_vals, y_vals, c='orange')

plt.plot(x_vals, reg_params, c='blue', lw=2)

plt.show()

inverse matrix를 이용한 Linear Regression

이런 방법은 데이터셋이 커지게 되면 느려진다는 단점이 있습니다.




참고 자료: 

[1]TensorFlow Machine Learning Cookbook, Nick McClure

[2]https://github.com/nfmcclure/tensorflow_cookbook

+ Recent posts