2016-10-24 1 views
0

일부 데이터를 통해 곡선을 맞추려고합니다.사인 함수가있는 데이터에서 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'를 동시에 셔플하여이 문제를 해결하려고했지만 아무런 효과가 없었습니다. 데이터의 자기 상관을 제거하는 것이 문제를 해결할 수 있다고 생각했습니다.

내 질문은 : 어떻게이 문제를 해결할 수 있습니까? 위의 스 니펫에서 합성 데이터의 사인 기여도를 변경할 수는 있지만 실제 데이터의 경우 분명히 그럴 수 없습니다.

+2

을, 나는 xdata''의 요소 (부정하지 않는 한 재치있는 맞는 값마다 시간을 반환 것 같다 찾을 경우'yData에 일부에서 '너는 소수의 힘으로 음수를 올리므로''나노 ''). –

+0

@AngusWilliams에 동의합니다. xdata (+0.002 대신 +0.003)에 작은 오프셋을 추가하면 합리적인 값이 반환됩니다. –

답변

0

당신은 모델 함수 내에서 음의 x 값에 의해 생성 된 NaN을 제거 할 수 있습니다

def f(x,a,b,c): 
    y = a +b*x**c 
    y[np.isnan(y)] = 0.0 
    return y 

최선의 선택을하지 않을 수 0 모든 NaN을 교체. 당신은 이웃 값을 시도하거나 어떤 종류의 외삽을 할 수 있습니다.

생성 된 테스트 데이터를 피드하는 경우 거기에 NaN이 없는지 확인해야합니다. 그래서 직접 데이터 생성 같은 것을 넣어 후에 : 당신의 코드를 실행하는 데

if xdata.min() < 0: 
    print 'expecting NaNs' 
    ydata[np.isnan(ydata)] = 0.0