티스토리 뷰

반응형

likethefirst.tistory.com/entry/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-Linear-Regression-Model-Basic

 

선형회귀 / Linear Regression Model / Basic

1. 선형회귀란 독립 변수 X와 X의 값에 따라 달라지는 종속 변수 Y와의 선형적인 상관 관계를 모델링하는 것이다. 즉 X에 따른 Y값을 예측하고 설명하는 것이다. 2. 예제 공부한 시간 2 4 6 8 성적 81

likethefirst.tistory.com

 

앞선 포스팅에서 선형회귀에 대한 개념과

관련된 공식 등을 알아보았다.

 

이번 포스팅에서는 위 포스팅에 있는 예제의 값을 이용하여

공식을 프로그래밍화하고, 결과값을 간단한 그래프로 나타내본다.

 

 

 

1. X와 Y를 선언하고 평균을 구하기

 

1
2
3
4
5
6
7
import numpy as np
 
= [2468# 평균은 5
= [81939197# 평균은 90.5
 
x_mean = np.mean(X) 
y_mean = np.mean(Y)
cs

 

 

  - 설명  

먼저 numpy를 import 해주고, np로 쓰기로 한다.

예제에서 공부한 시간을 독립변수 X로 설정하였고,

공부한 시간에 따른 성적인 종속변수를 Y로 설정했었다.

 

X와 Y를 각각 list로 선언하고,

numpy의 mean이라는 함수를 이용하여 

X(공부한 시간), Y(실제 점수)의 평균을 구하였다.

그것들을 x_mean, y_mean(평균)이라는 변수에 저장했다.

 

 

 

 

2. 기울기 a와 y절편 b를 구하는 공식(최소제곱법) 프로그래밍화하기

 

1
2
3
4
5
6
7
import math

= sum([(X[i] - x_mean ) * ( Y[i] - y_mean) for i in range (len(X))]) / sum([math.pow(i - x_mean, 2for i in X])
 
= y_mean - (x_mean * a)
 
y_e = [(a * i + b) for i in X]
 
cs

 

 

  - 설명  

이전 포스팅을 참고하면,

a = (x - x의 평균) * (y - y의 평균) 들의 총합 / (x - x의 평균)^2 들의 총합

b = y의 평균 - (x의 평균 * a)이라고 했었다.

 

 

 

2.1. 먼저 분자식부터 구상해보자. / line 3

(x - x의 평균) * (y - y의 평균) 들의 총합은

(X[i] - x_mean) * (Y[i] - y_mean)을

for i in range (len(X))의 범위로 반복하여 더하면 구할 수 있다.

 

그것을 옮기면 sum([(X[i] - x_mean) * (Y[i] - y_mean) for i in range(len(X))])

가 된다.

 

처음 보면 식이 복잡해 보일 수도 있는데..

sum([1, 2, 3])을 하면 6이 나온다.

리스트의 합계도 구할 수 있다는 것.

 

이와 같은 큰 틀 안에서,

sum([]) 안에 (X[i] - x_mean) * (Y[i] - y_mean)이

X의 인덱스만큼 반복되면 

(x - x의 평균) * (y - y의 평균) 들의 총합인

기울기 a를 구하는 식의 분자를 계산할 수 있다.

X와 Y의 개수는 같으므로 for i in range(len(Y))를 해도 상관 없다.

X와 Y의 공통적인 반복 범위를 선정하기 위해 len을 쓴 것이다.

 

 

 

2.2. 분모도 마찬가지 원리로 생각한다. / line 3

분모 식은 sum([math.pow(i - x_mean, 2) for i in X])

로 표현할 수 있는데,

이번에는 for i in X로 반복 범위를 설정하였다.

분모는 (x - x의 평균)^2의 총합들로, x에 대하여만 표현하면 되기 때문.

 

제곱을 표현하기 위해 math 라이브러리의 pow 함수를 사용했다.

pow(10,2)를 하면 10의 제곱으로 100이 된다.

 

math.pow(i - x_mean, 2)를 하면 (x - x의 평균)^2이 되는 것이고

분자 식을 표현한 것과 같이,

sum([] for i in X) 틀로 분모 공식을 완성할 수 있다.

 

 

 

2.3. b = y_mean - (x_mean * a)는 자명하다. / line 5

공식을 그저 변수명으로 변환한 것 뿐이다.

 

 

 

2.4. y_e = [(a * i + b) for i in X] / line 7

y_e란 실제 성적값(Y)가 아닌

이전 포스팅에서 구한 일차식인

y=ax+b(y=2.3x+79)에 입각한

성적 예측값(추정값)이다. (y_estimate)

 

그래서 X = [2, 4, 6, 8]을 

y=2.3x+79에 대입한 것을 반복하여

y_e를 구하는 식이다.

 

 

 

3. 간단한 그래프로 나타내보자.

공부한 시간 (2, 4, 6, 8)에 따른

실제 성적과 예측 성적을 간단한 그래프로 나타낼 것이다.

 

1
2
3
4
5
import matplotlib.pyplot as plt
 
plt.plot(X, y_e, 'c'
plt.plot(X, Y, 'ro')
plt.show()
cs

 

 

  - 설명  

그래프로 나타내기 위해 matplotlib의 pyplot을 불러온다.

그리고 그것을 plt라는 별칭으로 쓴다.

 

plt.plot(X, Y, '?')은 X에 대응하는 Y값을

'?' 옵션에 따라 그래프로 출력한다.

 

line 3 / 공부한 시간에 따른 예측 성적을 cyan 컬러 직선으로 표현 ('c')

line 4 / 공부한 시간에 따른 실제 성적을 red 컬러 점으로 표현 ('ro')

line 5 / plot을 화면에 출력한다.

 

 

 

  - 위의 전체 코드를 종합, 실행한 결과  

 

예측값은 청색 이어진 직선으로, 실제값은 빨간으로 나타났다.

공부한 시간의 변수인 X가 2, 4, 6, 8 이었으므로

실제값 Y도 불연속적으로 나타난다. (정의역이 연속된 수로 존재하지 않음.)

 

 

 

3.+ 추가로, X가 1, 3, 5, 7, 9일 때 Y 값을 예측하고 싶다면

X2 = [1, 3, 5, 7, 9] 하여 y2_e = [(a * i + b) for i in X2]만

추가해주면 간단하게 그래프로 확인이 가능하다.

 

 

 

마지막. 

모든 y_e(예측값)이 Y(실제값)과의 오차가

가장 최소화되도록 해야 한다.

그 오차를 수치로 판단하는 척도를 mse(평균 제곱 오차)라 한다.

다음 포스팅에서는 기울기 a와 y절편 b를 임의로 설정하고

그에 따른 mse도 계산하여 확인하는 포스팅을 할 것이다.

 

파이썬 라이브러리 matplotlib을 이용하여

아주 간단하게 그래프를 그릴 수 있어 좋았다.

반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요