2010-12-23 79 views

回答

5

下面是使用leastsq一个小例子:

import numpy as np 
import scipy.optimize as optimize 
import collections 

x = np.array([821,576,473,377,326,300]) 
y = np.array([255,235,208,166,157,140]) 

def sigmoid(p,x): 
    x0,y0,c,k=p 
    y = c/(1 + np.exp(-k*(x-x0))) + y0 
    return y 

def residuals(p,x,y): 
    return y - sigmoid(p,x) 

Param=collections.namedtuple('Param','x0 y0 c k') 
p_guess=Param(x0=600,y0=200,c=100,k=0.01) 
p,cov,infodict,mesg,ier = optimize.leastsq(
    residuals,p_guess,args=(x,y),full_output=1,warning=True) 
p=Param(*p) 
xp = np.linspace(100, 1600, 1500) 
print('''\ 
x0 = {p.x0} 
y0 = {p.y0} 
c = {p.c} 
k = {p.k} 
'''.format(p=p)) 

你可以计算残差这样:

resid=residuals(p,x,y) 
print(resid) 
# [ 0.76205302 -2.010142 2.60265297 -3.02849144 1.6739274 ] 

但你不必计算resid - infodict['fvec']已经包含了信息。

print(infodict['fvec']) 
# [ 0.76205302 -2.010142 2.60265297 -3.02849144 1.6739274 ] 

chisq=(infodict['fvec']**2).sum() 
# dof is degrees of freedom 
dof=len(x)-len(p) 
rmse=np.sqrt(chisq/dof) 
print(rmse) 
# 5.40092057562 
+0

感谢队友,它的工作原理 – zufryy 2010-12-24 07:42:31