도순씨의 코딩일지
딥러닝 :: 선형회귀, 최소 제곱법, 평균 제곱근 오차 본문
선형회귀란, 독립 변수 x와 이 독립 변수에 따라서 종속적으로 변하는 y의 움직임을 예측하고 설명하는 작업을 말한다.
그 중에서 최소 제곱법을 활용하여 최적의 기울기와 y절편을 찾을 수 있다. 선형회귀는 다음과 같이 정의될 수 있다.
이것을 코드로 구현해보면 다음과 같다.
@ 코드
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
|
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 |
@ 실행 결과
1
2
3
4
5
6
|
x의 평균값: 5.0
y의 평균값: 90.5
분모: 20.0
분자: 46.0
기울기 a = 2.3
y 절편 b = 79.0
|
cs |
하지만 이 식은 너무 단순하기 때문에 오차가 클 수도 있다는 단점이 있다. 그러므로 오차를 평가하는 방법이 필요하다.
오차를 평가하는 방법 중 가장 많이 사용되는 방법은 평균 제곱근 오차이다. 조금씩 수정해나가는 방법이다.
조금씩 변화를 주고 이 변화가 긍정적이라면 오차가 최소가 될 때까지 이 과정을 반복하는 방법이다.
오차 = 실제 값 - 예측 값으로 계산된다. 이 값을 모두 더해 데이터의 수로 나누면 평균 제곱 오차가 된다.
평균 제곱근 오차의 코드는 다음과 같다.
@ 코드
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
|
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 |
@ 실행 결과
1
2
3
4
5
|
공부한 시간= 2.000000, 실제 점수 = 81.000000, 예측 점수 = 82
공부한 시간= 4.000000, 실제 점수 = 93.000000, 예측 점수 = 88
공부한 시간= 6.000000, 실제 점수 = 91.000000, 예측 점수 = 94
공부한 시간= 8.000000, 실제 점수 = 97.000000, 예측 점수 = 100
rmse 최종값: 3.3166247903554
|
cs |
실행 결과를 통해 오차가 약 3.32라는 것을 알 수 있다.
* 출처
조태호, 모두의 딥러닝(2017), 길벗
'𝐂𝐎𝐌𝐏𝐔𝐓𝐄𝐑 𝐒𝐂𝐈𝐄𝐍𝐂𝐄 > 𝐃𝐄𝐄𝐏 𝐋𝐄𝐀𝐑𝐍𝐈𝐍𝐆' 카테고리의 다른 글
딥러닝 :: 모델 설계하기, 교차 엔트로피, 모델 실행하기 (0) | 2020.08.06 |
---|---|
딥러닝 :: 오차 역전파, 활성화 함수, 고급 경사 하강법 (0) | 2020.08.06 |
딥러닝 :: [논문분석] 김정미 외 1인, Word2vec을 활용한 RNN기반의 문서 분류에 관한 연구 (0) | 2020.08.06 |
딥러닝 :: 로지스틱 회귀, 퍼셉트론, 다층 퍼셉트론 (0) | 2020.08.06 |
딥러닝 :: 폐암 수술 환자의 생존률 예측하기 (0) | 2020.08.04 |
Comments