선형회기란, 쉽게 말하면 예측이 가능한 "선을 아주 잘~ 긋기" 라고 볼 수 있다.

 

먼저 딥러닝에서 독립변수와 종속변수의 개념부터 알아야 됨, 독립변수는 변하게 하는 요소, 즉 x에 해당하고 종속변수는 변하는 요소, 즉 y에 해당한다. 원인과 결과라고 이해하면 더 쉽다. 그래도 이해가 안간다면 아래 영상을 보면 이해댐.

https://youtu.be/p2iQSmSH-mI

 

그리고 단순선형회기와 다중선형회기로 나뉘는데 이건 그냥 x가 하나냐 아니면 x가 여러개냐 인 것임

 

 단순선형회기 Simple Linear Regression

먼저, 데이터를 설정해준다.

# 고성능의 수치 계산을 위한 라이브러리 Numpy.
# 데이터 연산시에 자주 사용된다.
import numpy as np

# 데이터 컨셉 설명
# x(학생의 공부 시간), y(공부 시간 x에 따른 점수)
x = [2, 4, 6, 8]
y = [81, 93, 91, 97]

mx = np.mean(x)
my = np.mean(y)

 

최소 제곱법 (예측 잘~하는 선을 위한 변수 구하기)

기울기 a 구하는 공식

y절편인 b 구하는 공식

위 두 공식을 코드로 표현하기

# 기울기 공식의 분모
divisor = sum([(mx - i)**2 for i in x])

# 기울기 공식의 분자
def top(x, mx, y, my):
    d = 0
    for i in range(len(x)):
        d += (x[i] - mx) * (y[i] - my)
    return d
dividend = top(x, mx, y, my)

# 기울기 구하기
a = dividend / divisor
# y절편 구하기
b = my - (mx*a)

 

평균 제곱근 오차 (RMSE)

최소 제곱법으로 구한 예측값에 대한 오차 구하기

p는 실제값이고 y는 예측값임

# RMSE 함수
def rmse(p, a):
   return np.sqrt(((p - a) ** 2).mean())

 

경사하강법으로 오차수정하기

import tensorflow as tf

data = [[2, 81], [4, 93], [6, 91], [8, 97]]
data_x = [x_row[0] for x_row in data]
data_y = [y_row[1] for y_row in data]

# 기울기 a와 y 절편 b의 값을 임의로 정한다.
# 단, 기울기의 범위는 0 ~ 10 사이이며 y 절편은 0 ~ 100 사이에서 변하게 한다.
a = tf.Variable(tf.random_uniform([1], 0, 10, dtype = tf.float64, seed = 0))
b = tf.Variable(tf.random_uniform([1], 0, 100, dtype = tf.float64, seed = 0))

# y에 대한 일차 방정식 ax+b의 식을 세운다.
y = a * x_data + b

# 텐서플로 RMSE 함수
# y가 예측값이고 y_data가 실제값이다.
rmse = tf.sqrt(tf.reduce_mean(tf.square( y - y_data )))

# 학습률 값 (keras에서는 자동으로 지정해준다.)
learning_rate = 0.1

# RMSE 값을 최소로 하는 값 찾기 (=경사 하강법 사용)
gradient_decent = tf.train.GradientDescentOptimizer(learning_rate).minimize(rmse)

# 텐서플로를 이용한 학습
# Session 함수를 통해 구현될 함수를 텐서플로에서는 '그래프'라고 부른다.
# Session이 할당되면 session.run('그래프명')의 형식으로 해당 함수를 구동시킨다.
with tf.Session() as sess:
    # 변수 초기화
    sess.run(tf.global_variables_initializer())
    # 2001번 실행(0번 째를 포함하므로)
    for step in range(2001):
        sess.run(gradient_decent)
        # 100번마다 결과 출력
        if step % 100 == 0:
            print("Epoch: %.f, RMSE = %.04f, 기울기 a = %.4f, y 절편 b = %.4f" % (step,sess.run(rmse),sess.run(a),sess.run(b)))

 

다중 선형 회기 Multiple Linear Regression

import tensorflow as tf

data = [[2, 0, 81], [4, 4, 93], [6, 2, 91], [8, 3, 97]]
x1_data = [x_row1[0] for x_row1 in data]
x2_data = [x_row2[1] for x_row2 in data]
y_data = [y_row[2] for y_row in data]

a1 = tf.Variable(tf.random_uniform([1], 0, 10, dtype=float64, seed=0))
a2 = tf.Variable(tf.random_uniform([1], 0, 10, dtype=float64, seed=0))
b = tf.Variable(tf.random_uniform([1], 0, 100, dtype=float64, seed=0))

y = a1 * x1_data + a2 * x2_data + b

rmse = tf.sqrt(tf.reduce_mean(tf.sqare(y-y_data)))

learning_rate = 0.1

gradient_decent = tf.train.GradientDescentOptimizer(learning_rate).minimize(rmse)

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
    
    for step in range(2001):
    	sess.run(gradient_decent)
        if step % 100 == 0:
        	print("Epoch: %.f, RMSE = %.04f, 기울기 a1 = %.4f, 기울기 a2 = %.4f, y절편 b = %.4f" % (step,sess.run(rmse),sess.run(a1),sess.run(a2),sess.run(b)))

 

파이썬이 주언어가 아니라서 코드 문법이 좀 이해가 안돼서 불 편하지만 계속하다보면 머 익숙해지겠지

+ Recent posts