Python/Numpy

[Numpy] 파이썬 1차/2차/n차 회귀식 구하기 및 시각화 예제(np.polyfit 함수 활용)

jimmy_AI 2022. 6. 18. 14:07
반응형

Python 넘파이 다항 회귀 예제 : np.polyfit 함수

파이썬에서 numpy 모듈의 polyfit 메소드를 활용하여 1차, 2차 및 n차 다항 회귀식을

구해보고, 결과를 시각화해보는 예시를 다루어보겠습니다.

 

 

1차 회귀식 구하기 및 결과 시각화 예시

먼저, 다음과 같은 x와 y에 대한 데이터가 있다고 가정해보겠습니다.

x = [1, 2, 3, 4, 5, 6]
y = [1, 3, 6, 8, 11, 19]

 

polyfit 함수의 사용법은 polyfit(x, y, 차수) 형태로 매우 간단하게 이용이 가능합니다.

예를 들어, 1차식으로 회귀를 진행한 결과는 아래와 같습니다.

import numpy as np

print(np.polyfit(x, y, 1))
# [ 3.31428571 -3.6       ] -> y = 3.314x - 3.6

결과로는 차수 + 1만큼의 길이의 숫자 배열이 반환되는데,

이 숫자들은 n차식 계수부터 차례대로 1차식 내려가며 상수항의 계수까지를 의미합니다.

 

위의 결과에서는 회귀식으로 대략 y = 3.314x - 3.6 정도의 결과가 반환되었습니다.

 

이제 위에서 구한 회귀식을 바탕으로

실제 x와 y 값들의 좌표와 회귀선을 같이 시각화해보는 코드의 예시는 아래와 같습니다.

import matplotlib.pyplot as plt

poly = np.polyfit(x, y, 1) # 1차, 상수항 계수가 순서대로 들어있는 배열
y_pred = np.array(x) * poly[0] + poly[1] # x 값에 회귀를 진행한 예측 y 값

plt.plot(x, y_pred, color = 'b')
plt.scatter(x, y, color = 'r')
plt.show()

 

반응형

 

2차 회귀식 구하기 및 결과 시각화 예시

이번에는 2차 회귀를 진행한 결과를 살펴보고 시각화를 마찬가지로 진행해보겠습니다.

 

먼저, polyfit 함수로 2차 회귀식을 구한 결과는 다음과 같습니다.

print(np.polyfit(x, y, 2))
# [ 0.53571429 -0.43571429  1.4       ] -> y = 0.5357x^2 - 0.4357x + 1.4

대략 y = 0.5357x^2 - 0.4357x + 1.4에 가까운 식으로 회귀가 진행되었습니다.

 

이번에는 위에서 구한 회귀식으로 시각화를 같은 식으로 해보겠습니다.

 

여기서 유의할 사항은 2차 이상의 식의 경우에는 np.linspace 함수를 이용하여

촘촘한 x 값을 새롭게 선언해준 뒤 이를 바탕으로 회귀 예측 식을 구해주셔야

회귀선이 완만한 곡선으로 그려질 수 있습니다.

poly = np.polyfit(x, y, 2) # 2차, 1차, 상수항 계수가 순서대로 들어있는 배열
x_line = np.linspace(1, 6, 100) # 곡선을 완만하게 그리기 위한 linspace 객체 선언
y_pred = x_line ** 2 * poly[0] + x_line * poly[1] + poly[2]

plt.plot(x_line, y_pred, color = 'b')
plt.scatter(x, y, color = 'r')
plt.show()

 

 

n차(n > 2) 회귀식 구하기 및 결과 시각화 예시

2차 이상의 고차 다항식으로 회귀식 추정 및 시각화를 진행하는 경우도

2차식의 예시와 마찬가지로 진행해주시면 됩니다.

 

5차식으로 회귀 진행 및 회귀선을 시각화를 해본 예시 코드는 아래와 같습니다.

여기서는 예측 값을 계산할 때, for문을 사용하여 각 차의 항들을 더해주었습니다.

poly = np.polyfit(x, y, 5) # 5, 4, 3, 2, 1차, 상수항 계수가 순서대로 들어있는 배열
x_line = np.linspace(1, 6, 100) # 곡선을 완만하게 그리기 위한 linspace 객체 선언

y_pred = np.zeros_like(x_line) # 예측 값을 구하기 위해 모든 값이 0인 배열 선언

for i in range(6): # 5, 4, 3, 2, 1차, 상수항에 대한 값들을 for문으로 더해서 계산
    y_pred += x_line ** (5 - i) * poly[i]

plt.plot(x_line, y_pred, color = 'b')
plt.scatter(x, y, color = 'r')
plt.show()

차수를 높이니 실제 x 및 y값의 위치에 매우 가깝게 회귀가 진행된 점을 살펴볼 수 있었습니다.