인공지능/딥 러닝

[모두의 딥러닝] 03. 가장 훌륭한 예측선 긋기: 선형회귀

Chipmunks 2018. 4. 5.
728x90


딥러닝의 가장 밑 단에서 이루어지는 가장 기본적인 두 가지 계산 원리

1. 선형 회귀

2. 로지스틱 회귀


선형 회귀의 정의

1. "학생들의 중간고사 성적이 다 다르다."
2. "학생들의 중간고사 성적이 [           ]에 따라 다 다르다."

[    ] 부분 : 시험 성적을 좌우할 만한 것들, '정보'라고 한다.
x : '정보' 요소, 독립 변수
y : x값에 의해 변하는 '성적', 종속 변수

➡️ 단순 선형 회귀(simple linear regression) : 하나의 x값만으로도 y값을 설명
➡️ 다중 선형 회귀(multiple linear regression) : x값이 여러 개 필요할 때

가장 훌륭한 예측선이란?

공부한 시간 x = { 2, 4, 6, 8 } ( 단위: 시간 )
성적 y = {81, 93, 91, 97} ( 단위 : 점 )



선은 직선, 일차 함수 그래프



a는 직선의 기울기, y값의 증가량 / x값의 증가량

b는 y축을 지나는 값인 'y 절편'


선형 회귀 : 정확한 직선을 그려내는 과정

➡️최적의 a 값과 b 값을 찾아내는 과정


최소 제곱법

최소 제곱법(method of least squares) : 회귀 분석에서 사용되는 표준 방식

➡️ 데이터를 분석하여 미지의 상수를 구할 때 사용되는 공식



각 x와 y의 편차를 곱해 이를 합한 값을 구한다.

이를 x 편차 제곱의 합으로 나눈다.

➡️ 우리가 원하는 기울기를 구할 수 있다.



➡️ 공부한 시간(x) 평균 : (2 + 4 + 6 + 8) / 4 = 5

➡️ 성적(y) 평균 : (81 + 93 + 91 + 97) / 4 = 90.5



기울기 a는 2.3이 나왔다. 다음은 y 절편인 b를 구하는 공식이다.



y의 평균에서 x의 평균과 기울기의 곱을 빼면, b의 값이 나온다.



직선의 방정식이 완성됐다.



< 오차가 최저가 되는 직선의 완성 >



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: utf-8 -*-
import numpy as np
 
# x 값과 y값
x=[2468]
y=[81939197]
 
# x와 y의 평균값
mx = np.mean(x)
my = np.mean(y)
print("x의 평균값:", mx)
print("y의 평균값:", my)
 
# 기울기 공식의 분모
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)
 
print("분모:", divisor)
print("분자:", dividend)
 
# 기울기와 y 절편 구하기
= dividend / divisor
= my - (mx*a)
 
# 출력으로 확인
print("기울기 a =", a)
print("y 절편 b =", b)
cs


평균 제곱근 오차

여러 개의 입력을 처리할 때, 최소 제곱법은 적용하기 힘들다.
딥러닝은 대부분 입력 값이 여러 개인 상황에서 실행된다.

임의의 선을 그리고 난 후, 이 선이 얼마나 잘 그려졌는지 평가하여 조금씩 수정해 가는 방법

평균 제곱근 오차 : 평균 제곱근 오차(root mean square error)

오차 = 실제값 - 예측 값

오차를 다 더한 값이, 실제로 얼마나 큰지를 가늠하기에는 적합하지 않다. 부호를 처리 안해줬기 때문.


오차의 합에 이어 각 x 값의 평균 오차(Mean Squared Error, MSE)를 이용한다.


때로 평균 제곱 오차가 너무 커서 쓰기가 불편할 때가 있다. 제곱근을 씌워준다. 이를 평균 제곱근 오차(Root Mean Squared Error, RMSE)라 한다.

예제 소스 : deep_class/02_RMSE.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#-*- coding: utf-8 -*-
 
import numpy as np
 
#기울기 a와 y 절편 b
ab=[3,76]
 
# x,y의 데이터 값
data = [[281], [493], [691], [897]]
= [i[0for i in data]
= [i[1for i in data]
 
# y=ax + b에 a,b 값 대입하여 결과를 출력하는 함수
def predict(x):
   return ab[0]*+ ab[1]
 
# RMSE 함수
def rmse(p, a):
   return np.sqrt(((p - a) ** 2).mean())
 
# RMSE 함수를 각 y값에 대입하여 최종 값을 구하는 함수
def rmse_val(predict_result,y):
   return rmse(np.array(predict_result), np.array(y))
 
# 예측값이 들어갈 빈 리스트
predict_result = []
 
# 모든 x값을 한 번씩 대입하여 predict_result 리스트완성.
for i in range(len(x)):
   predict_result.append(predict(x[i]))
   print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))
 
# 최종 RMSE 출력
print("rmse 최종값: " + str(rmse_val(predict_result,y)))
cs


댓글