본문 바로가기

AI Theory/key concept of AI

[모두의 딥러닝] 선형 회귀와 로지스틱 회귀

선형 회귀(linear regression)

가장 훌륭한 예측선 긋기

단순 선형 회귀(simple linear regression): 하나의 x만으로 y값을 설명 가능

y = ax + b

다중 선형 회귀(multiple linear regression): y를 설명하기 위해 여러 x값이 필요

 

최소 제곱법(method of least square)

a,b를 바로 구할 수 있다.

a = (x편차) * (y편차)의 합 / x편차의 합의 제곱

b = y의 평균 - (x평균 * 기울기a)

이를 통해 x에 대한 일차식을 구하면 이 직선이 바로 오차가 가장 적고 좌표의 특성을 가장 잘 나타내는 예측 직선

 

코딩으로 최소 제곱법 구현하기

#ch3 최소제곱법
import numpy as np

x = [2,4,6,8]
y = [81, 93, 91, 97]

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

# 분모: x편차의 제곱 구하기
divisor = sum([(mx-i)**2 for i in x])

# 분자: x편차*y편차
def top(x,mx,y,my):
  d = 0
  for i in range(len(x)):
    d += (x[i] - mx)*(y[i]-my)
  return d

divided = top(x, mx, y, my)

#기울기 a
a = divided / division

# y절편 b
b = my -(mx*a)

최소 제곱법으로 구한 직선이 얼마나 잘 그려졌는지 조금씩 고쳐가며 평가할 수 있다.

가장 많이 사용하는 오차 평가 방법: 평균 제곱근 오차

 

평균 제곱 오차(Mean Squared Error, MSE)

(오차 제곱의 합)/(총 개수)

 

평균 제곱근 오차(Root Mean Squared Error, RMSE)

평균 제곱 오차의 제곱근

우리는 평균 제곱근 오차가 가장 작은 선을 찾아야 한다.

선형 회귀는 임의의 직선을 구하고, 평균 제곱근 오차를 구하고 가장 작게 만들어주는 a,b를 찾는 작업이다

 

import numpy as np
#평균제곱근오차 구현

#기울기 a, 절편 b값 저장하기
ab = [3, 76]
data = [[2,81],[4,93],[6,91],[8,97]]
x = [i[0] for i in data]
y = [i[1] for i in data]

#내부함수 predict 생성하고 일차방정식 구현하기
def predict(x):
  return ab[0]*x + ab[1]

#평균제곱근공식함수
def rmse(p, a):
  return np.sqrt(((p-a)**2).mean()) #예측값 p 실제값 a

# rmse 함수에 데이터를 대입해 최종값 구하는 함수
def rmse_val(predict_result, y):
  return rmse(np.array(predict_result), np.array(y))

predict_result = [] #predict함수의 결과값이 저장되는 함수

for i in range(len(x)):
  predict_result.append(predict(x[i]))
  print("공부한 시간={}, 실제 점수={}, 예측 점수={}".format(x[i], y[i], predict(x[i])))


#최종 rmse 출력
print("최종 rmse값:{}".format(str(rmse_val(predict_result,y))))