선형 회귀(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()
최소 제곱법(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의 코드 참고
'AI > 모두의 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] 6. 다중 선형 회귀(multiple linear regression) (0) | 2023.05.18 |
---|---|
[모두의 딥러닝] 5. 경사 하강법(gradient decent) (0) | 2023.05.16 |
[모두의 딥러닝] 4. 평균 제곱 오차(Mean Square Error, MSE) (0) | 2023.05.16 |
[모두의 딥러닝] 2. 딥러닝을 위한 기초 수학 (0) | 2023.05.13 |
[모두의 딥러닝] 1. 폐암 수술 환자의 생존율 예측 코드 맛보기 (0) | 2023.05.12 |