본문 바로가기
파이썬 (Python)/딥러닝 (Deep Learning)

Python 딥러닝 선형 회귀 최소 제곱법 구현 해보기

by ★√★ 2021. 6. 4.

안녕하세요 이번 포스팅은 딥러닝 선형 회귀 최소 제곱 법에 대해서 작성하도록 하겠습니다. 최소 제곱 법은 기울기와 y의 절편을 각 항목의 평균을 이용해서 구하는 방식입니다.

 

선형 회귀 최소 제곱법 구현을 위한 Source Data 선언하기

 

: 일단 선형 회귀 최소 제곱 법을 구현하기 위해서 임의의 Source Data를 선언하도록 하겠습니다. Source Data는 주당 공부시간별 수학 점수입니다. 물론 한 사람의 케이스를 이용해서 기울기와 y 절편을 구하는 Source Data이기 때문에 간단하게 준비하였습니다.

 

▼ 선형 회귀 최소 제곱법을 위한 라이브러리까지 선언하는 코드는 아래와 같습니다. 

# 선형 회귀 최소 제곱법을 위한 라이브러리 선언 및 Source Data

# numpy 라이브러리를 선언
import numpy as np

#주당 시간을 T_W, 각 시간 별 수학성적을 Math_Score로 선언
T_W = [10, 20, 30, 40,50]
Math_Score = [80, 85, 70, 99, 90]

 

선형 회귀 최소 제곱법 구현

 

: 선형 회귀를 위한 최소 제곱 법의 수식을 간단하게 먼저 설명드리도록 하겠습니다. 일단 우리가 구해야 하는 것은 기울기와 y절편입니다. 이 두 가지 중에 기울기를 구하는 수식을 먼저 설명드리도록 하겠습니다. X의 값에서 X값의 평균값을 빼서 나온 값을 제곱한 합으로 X의 값에서 X값의 평균값 빼서 나온 값과 Y의 값에서 Y값의 평균값 빼서 나온 값을 곱한 값을 합산한 값을 나눠주는 것입니다.

 

▼  말로 설명하니 코드를 구현하는 걸 보시면 이해가 빠르실겁니다. 

# X 값인 주당시간의 평균을 구함
Mean_T_W = np.mean(T_W)

# Y 값인 주당시간별 수학성적의 평균을 구함
Mean_Math_Score = np.mean(Math_Score)

# 분모를 구하는 공식
dino_sum = sum([(i-Mean_T_W)**2 for i in T_W])

# 분자를 구하는 공식
def top (T_W, Mean_T_W, Math_Score, Mean_Math_Score):
    a_sum = 0
    for i in range(len(T_W)):
        a_sum += (T_W[i] - Mean_T_W) * (Math_Score[i] - Mean_Math_Score)
    return a_sum

num_sum = top(T_W, Mean_T_W, Math_Score, Mean_Math_Score)

# 분자를 분모로 나눠줌으로써, 기울기를 구할 수 있음
result1 = num_sum / dino_sum

# y 절편을 구하는 공식
result2 = Mean_Math_Score - (Mean_T_W * result1)

print("========== 분자 / 분모 ========")
print(result1)
print(result2)

 

▼  위 코드를 실행 시켜보면 아래와 같이 결괏값을 보실 수 있습니다. 즉 기울기는 0.34이고 y절편은 74.6이 되게 됩니다. 기본적인 식은 y = ax + b입니다. 여기에서 a는 0.34가 되고, b는 74.6이 되게 되는 겁니다.

========== 분자 / 분모 ========
0.34
74.6

 

 이제 구한 기울기와 y절편을 이용해서 최소 제곱법 모델을 실행시켜 보도록 하겠습니다. 여기에서 하나 말씀 드릴 게 있는데 선형 회귀 방식이라는 것은 선형적인 하나의 선을 만들어서 모델을 구현하는 방식입니다.

 

▼즉 모델의 결과값은 선형적인 선이 나와야 합니다. 최소 제곱 법 모델을 구현하는 방식은 아래와 같습니다. 

print("\n========== 최소 제곱법 모델 구현 =========")

# 반복문을 위한 임의의 변수 선언
j = 0

# 그래프로 보여주기 위해서 임의의 리스트를 하나 생성
Final_result =[]

# 반복문을 통해서 결과 값과 오차값을 출력하는 구문을 사용
for x in T_W:
    completed_model1 = result1 * x + result2
    print("시간 %.1f" % x, "점수 %.1f" % completed_model1, "오차 %.1f" % (completed_model1 - Math_Score[j]) )
    j = j+1
    Final_result.append(completed_model1)

 

 위 코드를 실행을 해보면 아래와 같은 결과값을 보실 수 있습니다. 아래 결과 값을 보시면, 선형으로 직선을 만들기 때문에 큰 차이가 나는 부분을 잘 보면 Source Data도 큰 차이를 보인 곳입니다. 아래 결과 값을 그래프로 한 번 표현해보도록 하겠습니다. X 축은 주당 시간이고, Y 축은 그에 따른 수학 점수입니다. 시각적으로 보여주면 제가 설명드린 "Source Data도 큰 차이를 보인 곳" 이해하시는데 편하실 겁니다.

========== 최소 제곱법 모델 구현 =========
시간 10.0 점수 78.0 오차 -2.0
시간 20.0 점수 81.4 오차 -3.6
시간 30.0 점수 84.8 오차 14.8
시간 40.0 점수 88.2 오차 -10.8
시간 50.0 점수 91.6 오차 1.6

최소-제곱법-결과값

 

 이상입니다. 지금까지 딥러닝 선형 회귀 최소 제곱법에 대해서 코드를 구현하는 과정을 포스팅으로 작성하였습니다. Source Data에서 큰 변화를 보이는 곳은 최소 제곱 법으로 구한 모델로 구현을 하게 되면 큰 오차가 발생하는 것을 확인하셨을 겁니다. 가장 기초적인 모델 방식이라서 한계가 있는 것으로 이해하시면 될 거 같습니다. 그럼 이를 기초로 더 나은 모델을 구현하기 위해서 노력하도록 하겠습니다. 그럼 이만 마무리하도록 하겠습니다. 감사합니다. 

 

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을 때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.] 

 

관련 다른 글

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab