파이썬 1차원 데이터 보간
아래와 같이 데이터를 측정했다 치자. 그리고 이 데이터의 모함수가 어떤 함수인지 모른다고 가정하자.
모함수를 모르기 때문에 피팅(Fitting)은 불가능하므로 보간을 통해 모함수를 추정하려고 한다.
주피터노트북 작업
이제 위 상황을 "데이터 측정 부터 파이썬 보간" 까지 했다고 치고 이 과정을 쭉 진행하려고 한다.
아래와 같이 x, y 데이터를 생성하고 우선 이를 그려본다.
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
# x: 측정범위
x = np.linspace(start=-5,stop=11,num=16)
# y: 측정값
y = np.array([-8.36351029e+04, -4.58159159e+04, -2.30056099e+04, -1.03575781e+04,
-3.83437530e+03, -9.39737971e+02, 9.61013664e+00, 1.34731663e+02,
3.60415578e+01, -8.19316285e+02, -2.99507330e+03, -2.12395094e+03,
1.10434626e+04, 3.23205331e+04, 2.43434765e+04, -5.34518140e+04])
# 측정값 플롯
plt.scatter(x,y,s=10,c='r',label='Measurement')
plt.legend()
plt.grid()
x는 측정 범위, y는 측정데이터이다. y=f(x)의 모함수를 모르기 때문에 피팅은 불가능하고, 따라서 이 점들 사이사이를 보간함수로 추정할 것이다. 이를 수행해주는 함수가 바로 scipy.interpolate 모듈에 있는 interp1d 함수이다.
interp1d는 아래와 같이 사용한다.
interp1d
우선 interp1d 함수의 인자는 아래와 같다.
x,y는 기본으로 들어간다. 그 외 인자는 써도 되고 안 써도 된다.
interp1d(
x, """ x 값 """
y, """ y 값 : 측정데이터 """
kind='linear', """ 보간함수 종류 """
axis=-1, """ 보간 축 설정: 기본값 = last axis """
copy=True, """ x,y 데이터 카피본 사용 여부: 기본값=True """
bounds_error=None, """ 범위 벗어남 에러 (바운드에러) : 범위 벗어날시 Error Raise """
fill_value=nan, """ 범위 벗어날 시 채울 값 """
assume_sorted=False, """ x가 정렬된 값인지의 여부: 기본값 = False """
)
# Return Value = 보간된 함수 리턴
그럼 바로 아래와 같이 보간을 진행해보겠다.
측정데이터 x,y 를 interp1d에 넣어 보간 함수를 생성하고 보간의 종류는 cubic으로 설정한다. 참고로 linear는 선형보간, quadratic은 2차함수 보간, cubic은 3차 함수 보간이다.
# 기존의 x,y 데이터로 보간 함수 생성.
interp_function = interp1d(x,y, kind='cubic')
# 보간 함수가 잘 만들어졌는지 확인하기 위해 새로운 x 데이터 생성
x1 = np.arange(start=-5,stop=11,step=0.01)
y1 = interp_function(x1)
# 보간된 값 플롯
plt.scatter(x1,y1,s=1,c='b',label='Interpolation')
# 측정값 플롯
plt.scatter(x,y,s=15,c='r',label='Measurement')
plt.legend()
plt.grid()
보간이 잘 되었는지 확인을 위해 기존의 x와 데이터 범위(min,max)는 같고 간격이 더 촘촘한 x1을 생성한다.
그리고 이 x1을 보간함수에 넣어 y1을 구해본다.
마지막으로 (x,y) scatter plot과 (x1,y1) scatter plot을 겹쳐 그려보면 보간 성공여부를 확인할 수 있다.
보간이 잘 된 것을 확인할 수 있다.
아래는 kind 인자를 각각 linear=선형보간, quadratic=2차함수 보간 으로 바꾸어 그래프를 다시 그려본 것이다.
추가로 위 x값의 범위를 더 확장시켜서 값을 출력하고 싶다면 fill_value="extrapolate"를 사용하면 된다.
외삽(extrapolation)은 측정 데이터 영역 바깥에서도 함수를 어느정도 연장하여 부드럽게 그려주는 역할을 한다.
도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :)
'데이터 피팅 & 보간' 카테고리의 다른 글
파이썬 여러 개의 함수 데이터 한 번에 보간 - 1차 보간법 예제 (2) | 2024.01.13 |
---|---|
파이썬 2차 보간법 완벽 예제!! - 면 보간, 면 피팅, interp2d, bisplrep (2) | 2023.05.14 |