2016-12-12 50 views
2

視覚的に法則分布を持つように見えるデータにフィットするカーブを見つけようとしています。curve_fitを使用してべき乗則分布に曲線をフィットさせない

enter image description here

私はscipy.optimize.curve_fitを利用することを望んだが、どんなに私は、私はどちらかはRuntimeError(パラメータが見つからないか、オーバーフローしない)または曲線適合しないことになっていますしてみてくださいどのような機能やデータの正規化私のデータは遠隔でも。私がここで間違っていることを理解するのを助けてください。トレースバック状態として

%matplotlib inline 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 

df = pd.DataFrame({ 
      'x': [ 1000, 3250, 5500, 10000, 32500, 55000, 77500, 100000, 200000 ], 
      'y': [ 1100, 500, 288, 200, 113, 67, 52, 44, 5 ] 
     }) 
df.plot(x='x', y='y', kind='line', style='--ro', figsize=(10, 5)) 

def func_powerlaw(x, m, c, c0): 
    return c0 + x**m * c 

target_func = func_powerlaw 

X = df['x'] 
y = df['y'] 

popt, pcov = curve_fit(target_func, X, y) 

plt.figure(figsize=(10, 5)) 
plt.plot(X, target_func(X, *popt), '--') 
plt.plot(X, y, 'ro') 
plt.legend() 
plt.show() 

出力

--------------------------------------------------------------------------- 
RuntimeError        Traceback (most recent call last) 
<ipython-input-243-17421b6b0c14> in <module>() 
    18 y = df['y'] 
    19 
---> 20 popt, pcov = curve_fit(target_func, X, y) 
    21 
    22 plt.figure(figsize=(10, 5)) 

/Users/evgenyp/.virtualenvs/kindle-dev/lib/python2.7/site-packages/scipy/optimize/minpack.pyc in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, **kwargs) 
    653   cost = np.sum(infodict['fvec'] ** 2) 
    654   if ier not in [1, 2, 3, 4]: 
--> 655    raise RuntimeError("Optimal parameters not found: " + errmsg) 
    656  else: 
    657   res = least_squares(func, p0, args=args, bounds=bounds, method=method, 

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800. 

答えて

6

、関数評価の最大数は、固定点(アルゴリズムを終了する)を求めることなく、達成されました。 maxfevオプションを使用して最大数を増やすことができます。この例では、maxfev=2000を設定すると、アルゴリズムを正常終了させることができます。

しかし、解決策は満足できるものではありません。これは、変数の初期推定値(デフォルト)を選択するアルゴリズムによるものです。この例では、適切ではありません(多くの反復が必要です)。 maxfevを増やす必要なく、別の初期化ポイント(単純な試行錯誤によって見つけられる)を提供することで、適切なフィット感が得られます。

データとの2つの適合および視覚的比較を以下に示す。

x = np.asarray([ 1000, 3250, 5500, 10000, 32500, 55000, 77500, 100000, 200000 ]) 
y = np.asarray([ 1100, 500, 288, 200, 113, 67, 52, 44, 5 ]) 

sol1 = curve_fit(func_powerlaw, x, y, maxfev=2000) 
sol2 = curve_fit(func_powerlaw, x, y, p0 = np.asarray([-1,10**5,0])) 

enter image description here

+0

あなたの助けと説明していただきありがとうございます。私はmaxfevを増やそうとしましたが、私のマシンでは2,000で十分ではなかったし、問題が他のどこかにあると思ってそれ以上増やさなかった。私は最初の推定を設定しようとしていないし、それは魅力のように動作します。 – 00111100b

関連する問題