본문 바로가기
통계, 신호처리, 알고리즘/Signal processing

SciPy의 'curve_fit'을 이용한 커브 피팅

by ggoboogi_house 2020. 4. 22.
반응형

<SciPy의 'curve_fit'을 이용한 커브 피팅>

SciPy의 'curve_fit'을 이용하면 입력데이터가 예상하는 특정 함수와 유사한 추이를 보이는지를 알아볼 수 있습니다.

입력데이터의 개형을 유추할 함수가 주어져야하며, 이때 해당하는 함수의 파라미터를 추정해줍니다.

 

♣ 실습  

1) 먼저 'curve_fit'을 사용하기 위해 scipy.optimize에서 함수를 호출합니다.

 

2) 지금은 피팅할 데이터가 없으니 임의로 피팅할 데이터를 생성합니다.

여기서는 3차 다항식를 생성하고 노이즈를 추가해주었습니다. 

 

3) 위의 데이터를 추정하기 위한 함수의 기본형을 설정해주어야 합니다.

경우에따라 함수의 기본형을 추정하기 어려울 때에는 몇번의 시행착오를 거쳐야 하기도 하며, 때로는 원하는 결과를 얻지 못할 수도 있습니다.

4) 자, 이제 커브피팅을 해봅시다. 3)에서 설정한 함수의 파라미터(위에서는 a, b)를 찾는 과정입니다.

'curve_fit' 함수는 기본적으로 추정하는 모델 함수, x 데이터, y 데이터 이 세가지를 최소 입력으로 필요로합니다.

그리고 2개의 결과값(popt. pcov)을 반환합니다. 

>>popt는 우리가 찾고자하는 3)에서 설정한 함수의 파라미터로,

아래 그림에서 볼 수 있는 것처럼 우리가 생성한 함수의 파라미터 2, -50와 유사한 1.99, -49.37의 값을 찾아주었습니다. 아래 그래프를 보면 테스트 함수에 매우 유사하게 피팅 된 것을 확인할 수 있습니다.

>>pcov는 popt의 공분산 추정값으로 자세한 내용은 SciPy 공식문서를 확인해주세요.

 

5) 커브피팅시 파라미터의 범위를 설정하여 피팅을 수행할 수 있습니다.

  추정하는 파라미터의 적정한 범위를 알고있다면 위 그림처럼 bounds=([a 최소값, b 최소값], [a 최대값, b 최대값]) 형식으로 입력해주면 각 파라미터의 자유도를 제한함으로써 원하는 함수를 더 정확하게 추정할 수 있습니다.

하지만 아래와 같이 범위를 설정이 잘못될 경우에는 원하는 결과를 얻지 못할 수도 있습니다.

* SciPy에서 커브피팅의 알고리즘은 3가지로 제공이 되는데, 'lm', 'trf', 'dogbox' 중 원하는 것을 선택할 수 있습니다. 

bounds가 설정이 되지 않은 경우 'lm' 알고리즘이 기본값으로, bounds가 설정된 경우 'trf' 알고리즘이 기본값으로 사용됩니다. 자세한 내용은 SciPy 공식문서를 확인해주세요.

 

<Reference>

- https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

 

 

 

 

반응형