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=[2, 4, 6, 8] y=[81, 93, 91, 97] # 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 절편 구하기 a = dividend / divisor b = 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 = [[2, 81], [4, 93], [6, 91], [8, 97]] x = [i[0] for i in data] y = [i[1] for i in data] # y=ax + b에 a,b 값 대입하여 결과를 출력하는 함수 def predict(x): return ab[0]*x + 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 |
'인공지능 > 딥 러닝' 카테고리의 다른 글
[모두의 딥러닝] 06. 퍼셉트론 (0) | 2018.05.06 |
---|---|
[모두의 딥러닝] 05. 참 거짓 판단 장치: 로지스틱 회귀 (0) | 2018.05.06 |
[모두의 딥러닝] 04. 오차 수정하기: 경사 하강법 (0) | 2018.05.06 |
[모두의 딥러닝] 02. 처음 해 보는 딥러닝 (0) | 2018.04.05 |
[모두의 딥러닝] 01. 파이썬과 텐서플로, 케라스 설치하기 (0) | 2018.03.27 |
댓글