데이터에 대한 Laguerre(라게르) 급수의 최소제곱 피팅을 수행하려면 Python NumPy에서 제공하는 laguerre.lagfit() 메서드를 사용하면 됩니다. 이 메서드는 낮은 차수부터 높은 차수 순으로 정렬된 Laguerre 계수를 반환합니다. 만약 y가 2차원 배열이라면, y의 k번째 열에 있는 데이터에 대한 계수가 결과의 k번째 열에 위치하게 됩니다.
주요 매개변수 살펴보기
x : M개의 샘플(데이터) 점 (x[i], y[i])의 x 좌표입니다.
y : 샘플 점들의 y 좌표입니다. 동일한 x 좌표를 공유하는 여러 데이터 세트가 있다면, 각 데이터 세트를 하나의 열로 포함하는 2차원 배열을 y에 전달함으로써 한 번의 호출로 독립적으로 피팅할 수 있습니다.
deg : 피팅 다항식의 차수입니다. 단일 정수를 지정하면 deg차 항까지 모든 항이 피팅에 포함됩니다.
rcond : 피팅의 상대 조건 수(relative condition number)입니다. 가장 큰 특이값에 비해 rcond보다 작은 특이값은 무시됩니다. 기본값은 len(x)*eps이며, 여기서 eps는 플랫폼 float 타입의 상대 정밀도로 대부분의 경우 약 2e-16입니다.
full : 반환값의 성격을 결정하는 스위치입니다. False(기본값)일 때는 계수만 반환되고, True일 때는 특이값 분해(singular value decomposition)로부터 얻은 진단 정보도 함께 반환됩니다.
w : 가중치입니다. None이 아닌 경우, 가중치 w[i]는 x[i] 지점에서의 제곱되지 않은 잔차 y[i] - y_hat[i]에 적용됩니다. 이상적으로는 w[i]*y[i] 곱의 오차들이 모두 동일한 분산을 갖도록 가중치를 선택해야 하며, 역분산 가중치를 사용할 때는 w[i] = 1/sigma(y[i])로 설정합니다. 기본값은 None입니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
from numpy.polynomial import laguerre as L
x 좌표를 생성합니다.
x = np.linspace(-1,1,51)
x 좌표를 출력합니다.
print("X Co-ordinate...\n",x)y 좌표를 생성합니다. 여기서는 x³ - x 함수에 무작위 노이즈를 추가했습니다.
y = x**3 - x + np.random.randn(len(x))
print("\nY Co-ordinate...\n",y)
데이터에 대한 Laguerre 급수의 최소제곱 피팅을 얻으려면 laguerre.lagfit() 메서드를 사용합니다. full=True 옵션을 사용하면 계수와 함께 진단 정보도 반환받을 수 있습니다.
c, stats = L.lagfit(x,y,3,full=True)
print("\nResult...\n",c)
print("\nResult...\n",stats)
전체 예제 코드
import numpy as np
from numpy.polynomial import laguerre as L
# 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)
# lagfit() 메서드로 최소제곱 피팅 수행
c, stats = L.lagfit(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...
[ 2.60011413 0.59715605 1.38401537 -1.76702116 -1.48948207 0.19627462
0.6350364 0.41990937 -0.72067571 0.07617042 0.33693761 1.08876378
0.71283482 1.36064396 0.55285081 1.94847732 1.14871192 -0.26605826
-1.18954961 1.15875553 0.30059389 -0.91705656 1.27988081 -0.42751846
0.44466317 -1.41118489 0.31492152 0.70787202 -0.85295102 -0.45038585
-2.05583591 -0.0799937 -1.13000262 0.09813804 -0.33068455 0.03329552
-0.7666786 -0.9596926 -0.72177629 -0.62779169 -0.75490363 -0.7826376
-2.26888118 1.1356559 -0.39593627 0.02709962 -0.95303898 -0.01582218
0.65609447 1.43566953 1.10442549]
Result...
[ 11.2805293 -36.35804353 36.47911284 -11.65554029]
Result...
[array([43.46828156]), 4, array([1.88377481, 0.66402594, 0.10220349, 0.00405509]), 1.1324274851176597e-14]
실행 결과를 보면 첫 번째 배열은 피팅된 Laguerre 계수(낮은 차수부터 높은 차수 순)를 나타내며, 두 번째 배열에는 잔차의 제곱합, 피팅의 랭크(rank), 특이값들, 그리고 상대 조건 수(rcond) 값이 진단 정보로 포함되어 있습니다.