#!/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
'Tensorflow > Linear Regression' 카테고리의 다른 글
LASSO and Ridge Regression (1) | 2018.04.27 |
---|---|
Deming Regression (0) | 2018.04.27 |
Loss Function in Linear Regressions (0) | 2018.04.26 |
TensorFlow Way of LinearRegression (0) | 2018.04.26 |
Implementing_a_Decomposition_Method with the Cholesky Decomposition Method (0) | 2018.04.26 |