본문 바로가기

데이터 피팅 & 보간

파이썬 1차원 보간법 완벽정리!! - 측정 데이터 보간

반응형

 

파이썬 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()

측정데이터 y

 

    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을 겹쳐 그려보면 보간 성공여부를 확인할 수 있다. 

측정치(red)와 보간 함수(blue)

   보간이 잘 된 것을 확인할 수 있다. 

아래는 kind 인자를 각각 linear=선형보간, quadratic=2차함수 보간 으로 바꾸어 그래프를 다시 그려본 것이다. 

선형보간, kind='linear'
2차함수 보간, kind='quadratic'

 

    추가로 위 x값의 범위를 더 확장시켜서 값을 출력하고 싶다면 fill_value="extrapolate"를 사용하면 된다. 

내삽과 외삽 비교, fill_value="extrapolate"

 

    외삽(extrapolation)은 측정 데이터 영역 바깥에서도 함수를 어느정도 연장하여 부드럽게 그려주는 역할을 한다. 

 

 

 

    도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :) 

 

반응형