2016-10-24 25 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データを再生しようとした」VEの、および正弦関数が問題を引き起こしていたことがわかった(データは日々変動が含まれています):私は明らかに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が故障の「臨界」値に近いことを発見した。小さければ手順は失敗する可能性が低く、その逆もあります。 0.002で手順は失敗する頻度で失敗する。

私は 'xdata'と 'ydata'を同時にシャッフルしてこの問題を解決しようとしましたが効果はありません。おそらくデータの自己相関を取り除くことで問題は解決するだろうと私は考えていた(特に理由はない)。

私の質問は:どうすればこの問題を解決/回避できますか?私は上記のスニペットの合成データの正弦的な寄与を変更することができますが、私の実際のデータでは明らかにできません。

+2

を、私はxdata' 'のいずれかの要素が(負でない限り、賢明なフィット値を毎回返すように見えることがわかり、その場合' ydataの一部で'あなたが負の数を分数の力に上げているので、' nan 'です)。 –

+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 
関連する問題