私はJacobianをSciPyのOptimizeライブラリのleastsq関数で動作させようとしています。SciPy LeastSq Dfun Usage
私は、次のコードを持っている:私はこれを実行したとき、私は私のリターンとしてplsq=[10,10,10]
を取得し、今
#!/usr/bin/python
import scipy
import numpy
from scipy.optimize import leastsq
#Define real coefficients
p_real=[3,5,1]
#Define functions
def func(p, x): #Function
return p[0]*numpy.exp(-p[1]*x)+p[2]
def dfunc(p, x, y): #Derivative
return [numpy.exp(-p[1]*x),-x*p[0]*numpy.exp(-p[1]*x), numpy.ones(len(x))]
def residuals(p, x, y):
return y-func(p, x)
#Generate messy data
x_vals=numpy.linspace(0,10,30)
y_vals=func(p_real,x_vals)
y_messy=y_vals+numpy.random.normal(size=len(y_vals))
#Fit
plsq,cov,infodict,mesg,ier=leastsq(residuals, [10,10,10], args=(x_vals, y_vals), Dfun=dfunc, col_deriv=1, full_output=True)
print plsq
を。私がDfun=dfunc, col_deriv=1
を取ったとき、私はp_real
の近くの何かを得る。
誰でも教えてください。あるいは、SciPyが提供するものよりも優れたドキュメントのソースを指摘してください。
ちなみに、私はヤコビ行列を使用しています。なぜなら、私は(おそらく誤って)信念があるために収束が速くなるからです。その負の
あなたの誘導体は、それがどうあるべきかの否定であるようですが、私には見えます - あなたの残差は実際の関数ではなく実際の関数であるからです。 – Owen
興味のある方のために。関数z = quad(x、y)で記述された3Dデータに5940の2次曲面を当てはめる上記のコードを同様に適用すると、ヤコビ行列を使用して平均0.5〜0.6秒のスピードアップが得られました。 – Richard
typo:y_messyはy_valsではありませんか? – denis