4

__call__かなり複雑な関数とデータ準備プロセス(一部の測定値に分析モデルデータを適合させる)があるため、Numpycurve_fit関数への入力としてクラスのメソッドを使用したいと思います。関数を定義することで問題なく動作しますが、クラスで動作させることはできません。

私の問題を再現するには、次のコマンドを実行できます。

import numpy as np
from scipy.optimize import curve_fit

#WORKS:
#def goal(x,a1,a2,a3,a4,a5):
#    y=a1*x**4*np.sin(x)+a2*x**3+a3*x**2+a4*x+a5
#    return y

# DOES NOT WORK:
class func():
    def __call__(self,x,a1,a2,a3,a4,a5):
        y=a1*x**4*np.sin(x)+a2*x**3+a3*x**2+a4*x+a5
        return y    

goal=func()

#data prepraration ***********
xdata=np.linspace(0,50,100)
ydata=goal(xdata,-2.1,-3.5,6.6,-1,2)
# ****************************

popt, pcov = curve_fit(goal, xdata, ydata)
print 'optimial parameters',popt
print 'The estimated covariance of optimial parameters',pcov

私が得るエラーは次のとおりです。

Traceback (most recent call last):
  File "D:\...some path...\test_minimizacija.py", line 35, in <module>
    popt, pcov = curve_fit(goal, xdata, ydata)
  File "C:\Python26\lib\site-packages\scipy\optimize\minpack.py", line 412, in curve_fit
    args, varargs, varkw, defaults = inspect.getargspec(f)
  File "C:\Python26\lib\inspect.py", line 803, in getargspec
    raise TypeError('arg is not a Python function')
TypeError: arg is not a Python function

どうすればこれを機能させることができますか?

4

1 に答える 1

3

簡単です(きれいではありませんが)、次のように変更するだけです:

popt, pcov = curve_fit(goal.__call__, xdata, ydata)

numpycurve_fitが、任意の callable ではなく、関数オブジェクトを渡すことを強制するのは興味深いことです ...

のソースをすばやく調べると、curve_fit別の回避策が考えられるようです。

popt,pcov = curve_fit(goal, xdata, ydata, p0=[1]*5)

ここで、p0は適合パラメーターの初期推定です。問題はscipy、関数への引数を調べて、最初の推測として実際にパラメーターを提供しない場合に使用するパラメーターの数を知ることです。ここでは、5 つのパラメーターがあるため、最初の推測は長さ 5 のすべてのもののリストです (scipy推測も提供しない場合は、デフォルトで 1 を使用します)。

于 2013-01-02T15:26:36.300 に答える