선형회기란, 쉽게 말하면 예측이 가능한 "선을 아주 잘~ 긋기" 라고 볼 수 있다.
먼저 딥러닝에서 독립변수와 종속변수의 개념부터 알아야 됨, 독립변수는 변하게 하는 요소, 즉 x에 해당하고 종속변수는 변하는 요소, 즉 y에 해당한다. 원인과 결과라고 이해하면 더 쉽다. 그래도 이해가 안간다면 아래 영상을 보면 이해댐.
그리고 단순선형회기와 다중선형회기로 나뉘는데 이건 그냥 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)))
파이썬이 주언어가 아니라서 코드 문법이 좀 이해가 안돼서 불 편하지만 계속하다보면 머 익숙해지겠지
'Machine Learning > 딥러닝' 카테고리의 다른 글
[딥러닝] keras 라이브러리 이용해서 모델 설계하기 (0) | 2022.03.13 |
---|---|
[모두의 딥러닝] 퍼셉트론, 신경망의 시작 (0) | 2022.03.11 |
[모두의 딥러닝] 로지스틱 회기 (Logistic Regression) (0) | 2022.03.11 |
[모두의 딥러닝] 아나콘다, 텐서플로 설치하고 파이참 연결하기 (0) | 2022.03.11 |