Hermite 급수(Hermite series)를 데이터에 대해 최소제곱법(Least Squares)으로 피팅하려면 Python NumPy의 hermite.hermfit() 메서드를 사용하면 됩니다. 이 메서드는 낮은 차수부터 높은 차수 순으로 정렬된 Hermite 계수를 반환하며, 만약 y가 2차원 배열이라면 y의 k번째 열에 있는 데이터에 대한 계수가 결과의 k번째 열에 위치하게 됩니다.
주요 매개변수 살펴보기
x와 y
매개변수 x는 M개의 샘플(데이터) 점 (x[i], y[i])의 x 좌표를 나타냅니다. 매개변수 y는 샘플 점들의 y 좌표입니다. 동일한 x 좌표를 공유하는 여러 개의 데이터 세트는 y에 각 열이 하나의 데이터 세트를 담고 있는 2차원 배열을 전달함으로써 한 번의 호출로 독립적으로 피팅할 수 있습니다.
deg
매개변수 deg는 피팅할 다항식의 차수(degree)를 지정합니다. deg가 단일 정수라면 deg차 항까지 포함한 모든 항이 피팅에 사용됩니다.
rcond
매개변수 rcond는 피팅의 상대 조건수(relative condition number)입니다. 가장 큰 특이값(singular value)에 상대적으로 rcond보다 작은 특이값들은 무시됩니다. 기본값은 len(x)*eps이며, 여기서 eps는 플랫폼 float 타입의 상대 정밀도로 대부분의 경우 약 2e-16입니다.
full
매개변수 full은 반환 값의 성격을 결정하는 스위치 역할을 합니다. False(기본값)일 때는 계수만 반환되고, True일 때는 특이값 분해(singular value decomposition)로부터 얻은 진단 정보도 함께 반환됩니다.
w
매개변수 w는 가중치(weights)입니다. None이 아닌 경우, 가중치 w[i]는 x[i] 지점에서의 제곱되지 않은 잔차(residual)인 y[i] - y_hat[i]에 적용됩니다. 이상적으로는 w[i]*y[i] 곱들의 오차가 모두 동일한 분산을 갖도록 가중치를 선택해야 하며, 역분산(inverse-variance) 가중치를 사용할 때는 w[i] = 1/sigma(y[i])로 설정합니다. 기본값은 None입니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
from numpy.polynomial import hermite as H
x 좌표를 생성합니다.
x = np.linspace(-1,1,51)
x 좌표를 화면에 출력합니다.
print("X 좌표...\n",x)y 좌표를 생성합니다. 여기서는 x³ - x 함수에 무작위 노이즈를 더한 값을 사용합니다.
y = x**3 - x + np.random.randn(len(x))
print("\nY 좌표...\n",y)
Hermite 급수를 데이터에 대해 최소제곱법으로 피팅하기 위해 hermite.hermfit() 메서드를 호출합니다. 이 메서드는 낮은 차수부터 높은 차수 순으로 정렬된 Hermite 계수를 반환하며, y가 2차원 배열이라면 y의 k번째 열 데이터에 대한 계수가 결과의 k번째 열에 위치합니다. 여기서는 full=True 옵션을 사용하여 진단 정보도 함께 받아옵니다.
c, stats = H.hermfit(x,y,3,full=True)
print("\n결과...\n",c)
print("\n결과...\n",stats)
전체 예제 코드
import numpy as np
from numpy.polynomial import hermite as H
# x 좌표 생성
x = np.linspace(-1,1,51)
# x 좌표 출력
print("X 좌표...\n",x)
# y 좌표 생성 (x^3 - x + 랜덤 노이즈)
y = x**3 - x + np.random.randn(len(x))
print("\nY 좌표...\n",y)
# hermite.hermfit() 메서드로 최소제곱법 피팅 수행
c, stats = H.hermfit(x,y,3,full=True)
print("\n결과...\n",c)
print("\n결과...\n",stats)
실행 결과
X 좌표...
[-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 좌표...
[-1.54632387 1.51958929 1.97346067 1.17759858 0.18851406 -0.43906085
-0.18878755 -0.25952276 -0.10422342 0.17851603 0.12145051 1.42408375
0.87115462 -1.03677161 1.01691995 0.45143153 -2.11382606 0.92466707
-0.04160743 0.9302213 1.19532222 1.69238045 1.63260027 -0.38037316
1.57013958 0.50920773 -0.19218013 -1.104298 0.10788693 0.68370213
0.7219109 1.28598447 -0.92218973 -0.11028072 -0.49917013 -1.44008132
-1.51616162 -0.80578712 1.47099231 -0.79775329 -1.0606385 -0.59517496
-0.32977967 1.04847432 -2.1621314 -0.40009103 -0.84519 0.06397194
-2.03655702 -0.28429534 0.47013787]
결과...
[-0.03198532 -0.0005095 -0.11666602 0.08302362]
결과...
[array([49.28934723]), 4, array([1.39825832, 1.20144978, 0.74600162, 0.21183404]), 1.1324274851176597e-14]
실행 결과를 보면 hermfit() 메서드가 3차 Hermite 급수에 대한 계수 배열을 반환했으며, full=True 옵션 덕분에 잔차의 제곱합, 계수의 개수(rank), 특이값들, 그리고 피팅의 상대 조건수 등 진단 정보도 함께 확인할 수 있습니다.