在jupyter笔记本下使用scipy.optimize中的fmin进行数据拟合

时间:2017-06-13 19:43:13

标签: python python-2.7 scipy regression

我正在尝试

使用fmin进行数据拟合
http://glowingpython.blogspot.ca/2011/05/curve-fitting-using-fmin.html

其中包含以下使用fmin的代码:

# fitting the data with fmin
p0 = rand(3) # initial parameter value
p = fmin(e, p0, args=(x,y))

但是,当我尝试它时,它会给我以下错误:

TypeErrorTraceback (most recent call last)
<ipython-input-1-41b53befd463> in <module>()
     22 # fitting the data with fmin
     23 p0 = rand(3) # initial parameter value
---> 24 p = fmin(e, p0, args=(x,y))
     25 
     26 print 'estimater parameters: ', p

TypeError: 'args' is an invalid keyword to ufunc 'fmin'

当我查看文档here时,我确实看到args是一个有效的关键字。

更新

我在Python2.7中按原样运行脚本,并得到了上述错误。 看过Warren Weckesser的回答是更新后的脚本:

from pylab import *
import numpy as np
from numpy.random import normal
from scipy.optimize import fmin

%pylab inline

# parametric function, x is the independent variable
# and c are the parameters.
# it's a polynomial of degree 2
fp = lambda c, x: c[0]+c[1]*x+c[2]*x*x
real_p = rand(3)

# error function to minimize
e = lambda p, x, y: (abs((fp(p,x)-y))).sum()

# generating data with noise
n = 30
x = linspace(0,1,n)
y = fp(real_p,x) + normal(0,0.05,n)

# fitting the data with fmin
p0 = rand(3) # initial parameter value
p = fmin(e, p0, args=(x,y))

print 'estimater parameters: ', p
print 'real parameters: ', real_p

xx = linspace(0,1,n*3)
plot(x,y,'bo', xx,fp(real_p,xx),'g', xx, fp(p,xx),'r')

show()

我仍然得到与上面完全相同的错误。

如何解决?谢谢。

1 个答案:

答案 0 :(得分:1)

如果您提供了再现问题的minimal, complete and verifiable example,那么帮助您会更容易。没有它,我们必须猜测。

在这种情况下,我的猜测是您实际使用的是numpy.fmin,而不是scipy.optimize.fmin。添加行

from scipy.optimize import fmin

位于脚本的顶部。如果你正在做类似

的事情
from numpy import *

(如glowingpython处的代码所示),然后删除该行,并使用

import numpy as np

并将np.前缀与您使用的所有numpy名称一起使用,或者只显示您实际使用的numpy中的那些名称,例如。

from numpy import array, linspace  # whatever you actually use
from numpy.random import rand      # etc.

使用*形式的import在脚本中是一种不好的做法,正是因为您有这个问题。

然而,当您在ipython或jupyter笔记本中进行交互式工作时,from pylab import *之类的内容非常方便。为了避免fminfmin隐藏到numpy的问题,你可以这样做:

from scipy import optimize

然后使用

调用fmin
p = optimize.fmin(e, p0, args=(x, y))