이전 포스팅에서 piecewise 함수를 사용해서 기울기가 달라지는 비선형 함수를 만들었다.
piecewise 함수를 역으로 이용해서 기울기가 달라지는 점과 달라진 기울기를 얻을 수 있는 방법이 있을까?
이 방법은 내가 고안한 방법이 아니라 stack over flow라는 코딩 관련 질문방에 올라온 답변을 나름대로 해석한 것이다.
(원 답글의 출처 : https://qastack.kr/datascience/8457/python-library-for-segmented-regression-a-k-a-piecewise-regression)
먼저 piecewise_linear라는 함수를 만들 것이다. 이 함수의 입력 변수는 x, x0, y0, k1, k2이고 출력 값은 기울기에 따른 두 개의 y 값이다.
def piecewise_linear(x, x0, y0, k1, k2) :
return np.piecewise(x, [x < x0], [lambda x : k1*x - k1*x0 = y0 , lambda x : k2*x - k2*x0 + y0])
이 함수에 관한 내용은 저번 포스팅 '[Python] 기울기가 달라지는 수치데이터 Fitting 하기 - 1 : piecewies 함수'에 나와있습니다.
2020/08/28 - [자연과학도를 위한 파이썬 (Python)] - [Python] 기울기가 달라지는 수치데이터 Fitting 하기 - 1 : piecewise 함수
본격적으로 Fitting을 하기전에 데이터 피팅(Data Fitting)이 무엇인지에 대해서 알아보자.
실험을 하는 이유는 항상 똑같이 반복되는 진리를 찾아내기 위해서이다.
내일 아침 태양이 뜬다는 사실 또한 우리가 매일 눈을 뜨면서 태양을 관측하는 일종의 실험을 하기 때문에 경험적으로 얻어진 진리인 것이다.
실험을 아주 많이 반복해서 데이터를 모아보니 어떤 관계성이 보이게 된다.
그 관계를 수학적 모델로 맞추어 보려는 시도가 바로 피팅(Fitting)이다.
지금까지 힘들게 만들었던 piecewise_linear 함수는 일종의 수학적 모델이다.
(x0, y0)을 지나면서 기울기가 변하는 직선을 수학적으로 표현한 것이다.
그럼 데이터를 수학적 모델에 맞추려면 어떻게 해야할까?
파이썬에는 scipy 라는 numpy 라이브러리와 같은 라이브러리가 있다.
scipy 라이브러리는 수학, 과학적 계산관 관련된 함수를 제공한다.
그중 피팅을 위해 사용되는 함수는 optimize에 있는 curve_fit 함수이다.
이 함수를 불러오기 위해 from scipy import optimize를 해준다.
from scipy import optimize
p, e = optimize.curve_fit(piecewise_linear, x, y)
p에는 피팅된 값들이 저장되고 e 에는 오류값이 저장된다.
피팅된 값을 눈으로 확인하기 위해서 x축 (xd) 을 먼저 설정해준다.
from scipy import optimize
p, e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(x[0], x[len(x)])
매트랩에는 matplotlib 이라는 그래프 그리는데 특화된 엄청난 라이브러리가 있다.
matplotlib 라이브러리를 이용해 원래 그래프와 피팅 값을 그릴 수 있다. (matplotlib에 대해서는 책 보고 공부해서 추가로 포스팅할 예정입니다)
import matplotlib.pyplot as plt
plt.plot(x, y) #원래 그래프
plt.plot(xd, piecewise_linear(xd, *p))
piecewise_linear의 입력 변수는 x, x0, y0, k1, k2 였다.
제일 첫번째 x는 x축 값을 의미하므로 xd를 넣어준다.
그다음으로 필요한 값은 x0, y0, k1, k2인데 p 속에 다 들어있다.
여러 변수를 넣어줄 때에는 *을 붙여줘서 *p로 입력해준다.
참고로 p를 보면 p = [ x0 , y0, k1, k2 ]이다.
이 방법을 응용해서 실험데이터를 넣어보았더니 기울기가 변화하는 구간을 잘 찾아주었다. 파란색이 원본 데이터이고 주황색이 피팅 데이터이다.
[파이썬 데이터분석공부] Pandas와 Numpy 무엇을 써야할까? (0) | 2021.06.15 |
---|---|
[Python] 코드블록을 구간별로 나누는 방법 : #%% code block (0) | 2020.09.07 |
[Python] 기울기가 달라지는 수치데이터 Fitting 하기 - 1 : piecewise 함수 (0) | 2020.08.28 |
[Python] 전압 한주기를 자동으로 찾아내는 소스코드 개발 (0) | 2020.08.26 |
[Python] numpy의 genfromtxt 함수를 이용해 csv 파일을 가져오기 (1) | 2020.08.25 |