일부 데이터를 통해 곡선을 맞추려고합니다.사인 함수가있는 데이터에서 Scipy curve_fit이 실패합니다.
def f(x,a,b,c):
return a +b*x**c
내가 어떤 결과를 얻을 수없는 scipy.optimize.curve_fit을 사용 : 그것은 (기본값)를 반환 초기 매개 변수 :
(array([ 1., 1., 1.]),
array([[ inf, inf, inf],
[ inf, inf, inf],
[ inf, inf, inf]]))
I를 다음과 같이 내가 맞게 노력하고있어 기능입니다 데이터 재생을 해봤 및 사인 함수가 문제를 일으키는 것을 발견 (데이터는 매일 변화를 포함) : 나는 분명히 curve_fit은 [0.1, 23.4, 0.56에 가까운 무언가를 반환하는 기대
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
xdata=np.random.rand(1000) + 0.002 *np.sin(np.arange(1000)/(1.5*np.pi))
ydata=0.1 + 23.4*xdata**0.56 + np.random.normal(0,2,1000)
def f(x,a,b,c):
return a +b*x**c
fit=curve_fit(f,xdata,ydata)
fig,ax=plt.subplots(1,1)
ax.plot(xdata,ydata,'k.',markersize=3)
ax.plot(np.arange(0,1,.01), f(np.arange(0,1,.01),*fit[0]))
fig.show()
].
xdata의 첫 번째 용어는 0에서 1 사이이고 값은 -0.002와 +0.002 사이에 추가되므로 sine 함수는 실제로 값 ('xdata')에 영향을 미치지 않는 것으로 보입니다. 피팅 절차가 실패하게됩니다. 나는 0.002 값이 실패의 'critical'값에 가깝다는 것을 발견했다; 크기가 작 으면 프로 시저가 실패 할 가능성이 낮고 반대의 경우도 마찬가지입니다. 0.002에서 절차는 실패한 횟수만큼 자주 실패합니다.
나는 'xdata'와 'ydata'를 동시에 셔플하여이 문제를 해결하려고했지만 아무런 효과가 없었습니다. 데이터의 자기 상관을 제거하는 것이 문제를 해결할 수 있다고 생각했습니다.
내 질문은 : 어떻게이 문제를 해결할 수 있습니까? 위의 스 니펫에서 합성 데이터의 사인 기여도를 변경할 수는 있지만 실제 데이터의 경우 분명히 그럴 수 없습니다.
을, 나는 xdata''의 요소 (부정하지 않는 한 재치있는 맞는 값마다 시간을 반환 것 같다 찾을 경우'yData에 일부에서 '너는 소수의 힘으로 음수를 올리므로''나노 ''). –
@AngusWilliams에 동의합니다. xdata (+0.002 대신 +0.003)에 작은 오프셋을 추가하면 합리적인 값이 반환됩니다. –