상세 컨텐츠

본문 제목

[SciPy. Curve_Fit] 쓰기위해서 배우는 최소한의 curve_fit 함수

프로그래밍/Python

by 척척석사 민준 2021. 6. 19. 02:22

본문

728x90

과학은 실험을 통해 만들어가고 증명해가는 것이라고 생각한다.
그럼 실험데이터를 이용해 말이 되도록? 설명할 수 있도록 해야하는데
그게 바로 그래프를 그리는 일이다.
백번 말로 이런거 같습니다 저런거 같습니다 해도
실제 그래프로 보여주지못하는 실험은 설득력이 떨어질 수 밖에 없다.


Scipy 라이브러리는 수학과 과학 계산에 필요한 여러 수식이나 계산식을 제공하는 라이브러리이다.
MATLAB은 라이브러리를 하나 사려면 수십 수백인데 파이썬은 공짜로 쓸 수 있으니 얼마나 좋은 세상인지...
curve_fit( ) 함수는 Scipy의 Optimize에 있습니다.
먼저 백문의 불여일견이라고 책에 있는 예를 이용해 curve_fit의 간단한 사용법을 알아보자.

(책이름은 SciPy and Numpy 저자는 Eli Bressert 입니다. 간단한 사용법과 응용을 보기에는 좋은 책인데 수학적인 설명이 없는게 좀 아쉬웠습니다)
(이런 계산 관련 라이브러리를 불러올때는 numpy도 같이 불러오는데, 계산 결과를 불러오고 그래프를 그릴 때 여러 배열을 제공해주고 배열간의 연산을 할때에는 numpy가 있어야 하기 때문이다)

import numpy as np
from scipy.optimize import curve_fit

def func(x,a,b):
	return a * x + b 
# func은 피팅을 진행할 일종의 모델이라고 생각할 수 있습니다. 

x = np.linspace(0,100) # x축을 만들어줍니다
y = func(x, 1, 2) # 함수를 이용해 원본의 데이터를 만들어줍니다. 기울기는 1 y절편은 2인 함수입니다. 
yn = y + 0.9 * np.random.normal(size = len(x)) #원본 데이터에 노이즈를 섞어 줍니다.

popt, pcov = curve_fit(func, x, yn) 
# 선형모델(func은 1차 함수여서 선형모델이라고 했습니다)을 이용해 피팅을 진행합니다.
#popt에는 피팅의 결과로 계산된 a, b 값이 저장됩니다
#pcov에는 얼마나 잘 피팅되었는지 오류에 관한 부분이 저장됩니다

print(popt)
# a, b 모두 설정한 값과 비슷한 값이 나옵니다

코드설명

1. def func(x, a, b) : 피팅을 하면 데이터들을 1차 함수나 아니면 다항함수로 근사를 하는데 이때 근사를 위한 모델이 이 함수 입니다. 간단하게 보기위해서 1차함수로 해주고 기울기 parameter로 a,  y절편으로 b 2개의 파라매터가 필요하다.

2. x = np.linspace(0,100) : 0부터 100까지 배열을 만들어준다 (x축으로 사용예정)

3. y = func(x, 1, 2) : 기울기는 1, y절편은 2인 1차 함수를 만든다

4. yn = y + 0.9 * np.random.normal(size = len(x)) : 랜덤한 데이터를 0.9의 가중치로 더해줘서 1차 함수 데이터를 지저분하게 만들어준다

5. popt, pcov = curve_fit(func, x, yn) : popt에는 피팅결과 즉 피팅으로 알아낸 파라매터 a,b를 결과로 반환하고

pcov에는 popt의 covariance를 계산해준다고 하는데 오류의 분산을 알려주는 거 같으며 covariance가 정확히 무엇인지는 몰라서 추후 공부해서 보충하겠습니다.

popt , pcov = curve_fit(func, x, yn, po = [1.1, 1.9]) 이런식으로 초기값 (initial guess)를 넣어주면 좀더 정확한 피팅값이 나올 수 있다. 복잡한 함수일 수록 initial guesses가 있고 없고의 차이가 있다고 한다.

perr = np.sqrt(np.diag(pcov))는 scipy document(https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html) 에 나와있는 오류의 분산(deviation)을 계산하는 방법이다.

확실히 초기값을 넣어줬더니 오류의 분산이 조금 줄어들었다. 

(사실 random함수가 매번 값을 바꾸기 때문에 같은 상황이 아니어서 단순비교는 어렵다)


그냥 사용하는 거야 구글링을 해서 코드를 이어붙이면 어떻게든 하는데

응용을 통해서 과학적인 결과를 도출하기 위해서는 curve_fit 이 어떤 수학적인 알고리즘으로 피팅을 하는지

계산에서 사용하는 수학적 모델이 무엇이고 그 방법으로 계산했을 때의 오류는 믿을만한 수준안에 있는지 등을 알아야 한다고 생각한다.

SciPy 홈페이지나 Scipy and Numpy에는 사용법과 사용되는 변수의 의미만 설명되어있고 실질적인 내용은 없어서 

Introducition to Python for Science and Engineering -  David J. Pine 을 찾아봤다.

이 책에서 비교적 상세한 수학적인 설명과 예시가 있어서 조금이나마 어떤 수학적 알고리즘으로 계산이 되는건지

어떻게 해야 좋은 피팅이 된 것인지 등을 알 수 있었다.

 

 

쓰다보니 내용이 길어져서 다음 포스팅에서 정리해서 최소한의 수학적인 내용으로 소개하겠습니다.

(저도 수학을 잘 못해서 수학적으로 엄밀하게는 못합니다..ㅎㅎ)


3줄요약

1. curve_fit 에는 모델로 사용할 함수 + parameters 가 필요하다

2. curve_fit의 결과값 popt에는 피팅의 결과로 파라매터값을 얻을 수 있으며 pcov에는 오류를 계산할 수 있는 값이 저장된다

3. p0 = initial guesses 라고 초기값을 넣어주면 좀더 정확한 피팅이 된다

728x90

관련글 더보기