Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy로 데이터에 대한 다항식 최소 제곱 피팅 구하기 – polynomial.polyfit() 완벽 가이드

polynomial.polyfit()으로 다항식 최소 제곱 피팅 구하기

데이터에 대한 다항식의 최소 제곱 피팅(least-squares fit)을 구하려면 Python NumPy의 polynomial.polyfit() 함수를 사용하면 됩니다. 이 메서드는 낮은 차수부터 높은 차수 순으로 정렬된 다항식 계수를 반환합니다. 만약 y가 2차원 배열이라면, coef의 k번째 열에 있는 계수들은 y의 k번째 열 데이터에 대한 다항식 피팅 결과를 나타냅니다.

주요 매개변수 살펴보기

x – 샘플 점의 x 좌표

M개의 샘플(데이터) 점 (x[i], y[i])에 대한 x 좌표를 의미합니다.

y – 샘플 점의 y 좌표

샘플 점들의 y 좌표입니다. 동일한 x 좌표를 공유하는 여러 세트의 샘플 점도 한 번의 polyfit 호출로 (독립적으로) 피팅할 수 있습니다. 이 경우 데이터 세트당 하나의 열을 포함하는 2차원 배열을 y에 전달하면 됩니다.

deg – 피팅 다항식의 차수

피팅할 다항식의 차수(Degree)를 지정합니다. deg가 단일 정수라면 deg차 항까지 포함된 모든 항이 피팅에 사용됩니다.

rcond – 상대 조건 수

피팅의 상대 조건 수(relative condition number)입니다. 최대 특잇값(singular value)에 비해 rcond보다 작은 특잇값은 무시됩니다. 기본값은 len(x)*eps이며, 여기서 eps는 플랫폼 float 타입의 상대 정밀도로 대부분의 경우 약 2e-16입니다.

full – 진단 정보 반환 여부

반환값의 성격을 결정하는 스위치입니다. False(기본값)일 때는 계수만 반환되고, True일 때는 특이값 분해(SVD)에서 얻은 진단 정보까지 함께 반환됩니다.

w – 가중치

가중치 매개변수입니다. None이 아닌 경우, 가중치 w[i]는 x[i] 지점에서의 제곱되지 않은 잔차 y[i] - ŷ[i]에 적용됩니다. 이상적으로는 w[i]*y[i] 곱의 오차가 모두 동일한 분산을 갖도록 가중치를 선택해야 하며, 역분산(inverse-variance) 가중치를 사용할 때는 w[i] = 1/sigma(y[i])로 설정합니다. 기본값은 None입니다.

구현 단계

먼저 필요한 라이브러리를 임포트합니다.

import numpy as np
from numpy.polynomial import polynomial as P

x 좌표를 생성합니다.

x = np.linspace(-1,1,51)

x 좌표를 출력합니다.

print("X Co-ordinate...\n",x)

y 좌표를 생성합니다. 여기서는 3차 다항식에 무작위 노이즈를 추가했습니다.

y = x**3 - x + np.random.randn(len(x))
print("\nY Co-ordinate...\n",y)

polynomial.polyfit()을 사용하여 데이터에 대한 다항식의 최소 제곱 피팅을 구합니다.

c, stats = P.polyfit(x,y,3,full=True)
print("\nResult...\n",c)
print("\nResult...\n",stats)

전체 예제 코드

import numpy as np
from numpy.polynomial import polynomial as P

# x 좌표 생성
x = np.linspace(-1,1,51)

# x 좌표 출력
print("X Co-ordinate...\n",x)

# y 좌표 생성 (노이즈 추가)
y = x**3 - x + np.random.randn(len(x))
print("\nY Co-ordinate...\n",y)

# polynomial.polyfit()으로 다항식 최소 제곱 피팅 수행
# 낮은 차수부터 높은 차수 순으로 계수가 반환되며,
# full=True이므로 SVD 진단 정보도 함께 반환됩니다.
c, stats = P.polyfit(x,y,3,full=True)
print("\nResult...\n",c)
print("\nResult...\n",stats)

실행 결과

X Co-ordinate...
[-1. -0.96 -0.92 -0.88 -0.84 -0.8 -0.76 -0.72 -0.68 -0.64 -0.6 -0.56
-0.52 -0.48 -0.44 -0.4 -0.36 -0.32 -0.28 -0.24 -0.2 -0.16 -0.12 -0.08
-0.04 0. 0.04 0.08 0.12 0.16 0.2 0.24 0.28 0.32 0.36 0.4
0.44 0.48 0.52 0.56 0.6 0.64 0.68 0.72 0.76 0.8 0.84 0.88
0.92 0.96 1. ]

Y Co-ordinate...
[ 0.24282445 -0.48320773 -1.18068109 -0.48486683 0.80514762 0.48976259
0.31363813 -0.03382685 -0.92334611 0.86835062 0.24661201 0.9790978
0.03782101 0.12213365 -1.37248029 1.99891304 -0.09825977 1.74524931
0.70560858 0.15516069 0.69169705 0.76957712 -1.21919676 1.50064825
1.32101339 -2.51479992 -0.28998783 -1.24293076 0.45927699 -0.53484746
0.50455341 -0.06351788 -2.69585303 -0.46833578 1.4924168 -2.42374146
-1.91934499 -1.36311466 -1.23946547 -1.56822005 -0.79648036 1.58269324
-0.53682862 -0.90861958 -0.28174461 -0.10775622 0.58535687 1.06373501
-2.28991738 2.01597286 -0.75841069]

Result...
[-0.17198829 -1.84107674 0.09439374 2.39030912]

Result...
[array([60.43653521]), 4, array([1.38446749, 1.32119158, 0.50443316, 0.28853036]), 1.1324274851176597e-14]

실행 결과를 보면 3차 다항식에 해당하는 네 개의 계수 [-0.17198829, -1.84107674, 0.09439374, 2.39030912]가 낮은 차수부터 순서대로 반환된 것을 확인할 수 있습니다. 또한 full=True 옵션 덕분에 잔차의 제곱합, 계수의 랭크, 특잇값, rcond 값 등 유용한 진단 정보도 함께 얻을 수 있습니다.