2017-04-08 3 views
0

특정 범위 내에서 x 값만 사용하도록 curve_fit에 지시 할 가능성을 찾을 수 없습니다. "범위"매개 변수를 찾았지만 내 함수의 매개 변수에만 적용되는 것 같습니다.Python : scipy.optimze의 Curve_fit은 x 값의 범위에 대한 가능성이 없습니다

데이터가있을 때, 예를 들어 선형 커브 (예 : 데이터의 특정 영역에만 해당)에 적합하게하려면 새 목록을 만들어야합니다. 특히 pyplot.plot은 x와 y 값에 대해 두 개의 개별 목록을 취하는 반면 manuall 정렬을 위해서는 (x, y) 쌍으로 필요합니다.

답변

1

가장 쉬운 해결책은 실제로 원래 목록의 필터링 된 버전 인 새 목록을 만드는 것입니다. 물론 파이썬리스트 대신 numpy 배열로 작업하는 것이 가장 좋습니다.

그래서 x는 함수 f에 몇 개의 a보다 큰 경우 만 해당 값에 맞게하고자하는 두 개의 배열 xy을 가지고 가정합니다. 당신은

x2 = x[x>a] 
y2 = y[x>a] 
popt2, _ = scipy.optimize.curve_fit(f, x2, y2) 

으로 완벽한 예를 필터링하고 curve_fit 수 있습니다

import numpy as np; np.random.seed(0) 
import matplotlib.pyplot as plt 
import scipy.optimize 

x = np.linspace(-1,3) 
y = x**2 + np.random.normal(size=len(x)) 
f = lambda x, a,b : a* x +b 

popt, _ = scipy.optimize.curve_fit(f, x,y, p0=(1,0)) 

x2 = x[x>0.7] 
y2 = y[x>0.7] 
popt2, _ = scipy.optimize.curve_fit(f, x2,y2, p0=(1,0)) 

plt.plot(x,y, marker="o", ls="", ms=4, label="all data") 
plt.plot(x, f(x, *popt), color="moccasin", label="fit all data") 
plt.plot(x2, f(x2, *popt2), label="fit filtered data") 

plt.legend() 
plt.show() 

enter image description here

마지막으로 그냥 언급, 당신은 또한 x[(x>0.7) & (x<2.5)] 같은 논리 연산자를 사용하여 여러 조건을 연결할 수 있습니다.