#!/usr/bin/env python3


Using the Cholesky Decomposition Method


Linear Regression은 $A \cdot x=y$을 사용합니다. 

Cholesky decomposition은 matrix $A$를 lower triangular matrix $L$과 $L^{T}$로 분해합니다.

차원을 같게 하기 위해 matrix $A$ 앞에 $A^{T}$를 곱하여 square matrix로 만듭니다.

따라서 아래와 같은 식이 성립합니다.

$A^{T} \cdot A=L^{T} \cdot L$


Linear Regression을 적용하면 아래와 같이 사용할 수 있습니다.

$A\cdot X=Y$

$(A^{T} \cdot A) \cdot X = A^{T} \cdot Y$

$(L^{T} \cdot L) \cdot X = A^{T} \cdot Y$

$L^{T} \cdot Z = A^{T} \cdot Y$,     $L \cdot X = Z$


Cholesky decomposition을 Linear Regression에 적용하기 위해서는 다음과 같은 step이 필요합니다.

1. $A^{T} \cdot A = L^{T} \cdot L$에서 $L$을 구합니다.

2. $L^{T} \cdot Z = A^{T} \cdot Y$에서 $Z$를 구합니다.

3. $L \cdot X = Z$에서 $X$를 구합니다.


$X$는 우리가 구하고자 하는 slope와 intercept가 있는 matrix입니다.


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

import tensorflow as tf

import numpy as np


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

print(x_vals[:6])

# [[0.        ]

#  [0.1010101 ]

#  [0.2020202 ]

#  [0.3030303 ]

#  [0.4040404 ]

#  [0.50505051]]


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

print(y_vals[:6])

# [[-1.34770577]

#  [-0.4146378 ]

#  [-0.14096172]

#  [ 0.23305495]

#  [ 1.66821972]

#  [-0.35141322]]


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

print(ones[:6])

# [[1.]

#  [1.]

#  [1.]

#  [1.]

#  [1.]

#  [1.]]


A = np.c_[x_vals, ones]

print(A[:6])

# [[0.         1.        ]

#  [0.1010101  1.        ]

#  [0.2020202  1.        ]

#  [0.3030303  1.        ]

#  [0.4040404  1.        ]

#  [0.50505051 1.        ]]


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

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


with tf.Session() as sess:

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

    L = tf.cholesky(tA_A)

    

    # solve $L\cdot Z=A^{T}  \cdot Y$, for $Z$

    tA_y = tf.matmul(tf.transpose(A_tsr), y_tsr)

    sol1 = tf.matrix_solve(L, tA_y)

    

    # solve $L^{T} \cdot X= Z$,  $Z$=sol1,  for $X$

    sol2 = tf.matrix_solve(tf.transpose(L), sol1)

    solution = sol2.eval()


slope = solution[0][0]

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

# slope: 0.988516


cept = solution[1][0]

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

# intercept: 0.163



시각화는 다음코드로 구현할 수 있습니다.

import matplotlib.pyplot as plt


reg_params = []

for i in x_vals.ravel():

    poly = i*slope + cept

    reg_params.append(poly)

    

plt.scatter(x_vals, y_vals, label='data')

plt.plot(x_vals, reg_params, c='red', label='best fit line')

plt.xlabel('feature 0', size=15)

plt.ylabel('feature 1', size=15)

plt.legend(loc='upper center', bbox_to_anchor=[0.1, 1.1], fancybox=True)

plt.show()

Cholesky 분해로 분석한 LinearRegression




참고 자료: 

[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
Inverse Matrix Method  (0) 2018.04.26

+ Recent posts