【问题标题】:Data fitting using fmin from scipy.optimize under jupyter notebook在 jupyter notebook 下使用来自 scipy.optimize 的 fmin 进行数据拟合
【发布时间】:2017-06-25 03:49:01
【问题描述】:

我在努力

使用 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()

我仍然遇到与上述完全相同的错误。

如何解决?谢谢。

【问题讨论】:

  • 所以你对那段代码做了一些修改?展示下!这段代码复制粘贴应该可以工作! (希望您没有将文件命名为 fmin.py)
  • 应该可以”,至少我试过了,而不是仅仅认为它应该可以用。
  • 当我删除%pylab inline 行并运行该脚本时,它对我有用。你是如何运行代码的?
  • 你使用的是 jupyter notebook 吗?如果是这样,%pylab inline 将导致fminnumpy.fmin 替换。事实上,当我这样做时,它会给我一条警告消息(带有红色背景)告诉我"pylab import has clobbered these variables: ['fmin']"
  • 是的@WarrenWeckesser,确切地说,我正在使用jupyter notebook,它一直以红色背景输出警告消息。我也收到了clobbered 警告,但无法解释它的确切含义。感谢您深入了解它。那么这是否意味着我不能使用jupyter notebook,至少在%pylab inline模式下?

标签: python python-2.7 scipy regression


【解决方案1】:

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

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

from scipy.optimize import fmin

在脚本的顶部。如果你正在做类似的事情

from numpy import *

(就像glowingpython 的代码一样),然后删除该行,然后使用

import numpy as np

并在您使用的所有 numpy 名称中使用 np. 前缀,或者仅从您实际使用的 numpy 中显式导入这些名称,例如

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

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

不过,当您在 ipython 或 jupyter notebook 中交互工作时,from pylab import * 之类的东西确实非常方便。为了避免 fmin 被 numpy 中的 fmin 遮蔽的问题,您可以这样做:

from scipy import optimize

然后使用

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

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多