[모두의 딥러닝] 3. 선형 회귀(linear regression), 최소 제곱법(method of least squares)

선형 회귀(linear regression) 정의

- 독립 변수 x를 사용해 종속 변수 y의 움직임을 예측하고 설명

- 하나의 x값으로 y값을 설명할 수 있다면 단순 선형 회귀, x값이 여러 개 필요하면 다중 선형 회귀

 

 

  •  독립 변수

: 'x값이 변함에 따라 y값이 변한다' 에서 독립적으로 변할 수 있는 x값

 

  • 종속 변수

: 'x값이 변함에 따라 y값이 변한다' 에서 독립 변수에 따라 종속적으로 변하는 y값

 

 

 

단순 선형 회귀 예제

- 중간고사를 본 4명의 학생의 공부한 시간과 성적 조사

- 독립 변수 : 공부한 시간 / 종속 변수 : 성적

공부한 시간 2 4 6 8
성적 81 93 91 97
# maplotlib 라이브러리 사용해서 그래프로 나타내기
import matplotlib.pyplot as plt

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

plt.scatter(x, y)
plt.xlabel('time')
plt.ylabel('score')
plt.show()

x축은 공부한 시간, y축은 성적

 

 

 

최소 제곱법(method of least squares)

- 데이터가 선형일 때, 데이터들의 특징을 가장 잘 나타내는 하나의 선을 찾는 것이 선형 회귀

- 즉, y = ax + b에서 최적의 a값(기울기)과 b값(y절편)을 찾아내는 것

- 일차 함수 y = ax + b에서 a, b값을 바로 구할 수 있는 공식이 최소 제곱법

- 입력 값이 여러 개인 경우, 사용하기 어려움

 

 

  • 기울기 a값 구하는 공식

 

  • y절편 b값 구하는 공식

 

  • 예제에 적용

: 최소 제곱법 공식에 적용하면 a = 2.3 / b = 79이 나오므로 직선의 방정식은 y = 2.3x + 79

: 이 직선의 방정식에 다른 x값을 넣어서 '공부한 시간에 따른 성적' 예측

# 예측 직선 그리기
import matplotlib.pyplot as plt

x = [2,4,6,8]
y = [81, 93, 91, 97]
predict = [83.6, 88.2,92.8,97.4]

plt.scatter(x, y)
plt.scatter(x, predict)
plt.plot(x, predict, c='r')
plt.xlabel('time')
plt.ylabel('score')
plt.show()

 

 

 

최소 제곱법 - 파이썬 코드로 구현

1. 환경 및 데이터 준비

# 넘파이 라이브러리 불러오기
import numpy as np

# 공부한 시간과 성적을 각각 x, y라는 이름의 넘파이 배열로 만듦
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])

 

2. x와 y의 평균 구하기

  • mean()

: 모든 원소의 평균 구함

: 넘파이에 존재

#x의 평균값을 구함
mx = np.mean(x)

#y의 평균값을 구함
my = np.mean(y)

print("x의 평균값:", mx)
print("y의 평균값:", my)
x의 평균값: 5.0
y의 평균값: 90.5

 

3. 기울기 공식의 분모, 분자 구하기

# 기울기 공식의 분모
divisor = sum([(i - mx)**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)
분모: 20.0
분자: 46.0

 

4. 기울기와 y절편 구하기

# 기울기 a를 구하는 공식
a = dividend / divisor

# y절편 b를 구하는 공식
b = my - (mx*a)

print("기울기 a =", a)
print("y절편 b =", b)
기울기 a = 2.3
y절편 b = 79.0

 

 

 

'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고