首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python iminuit属性错误

python iminuit属性错误
EN

Stack Overflow用户
提问于 2016-11-01 13:02:04
回答 1查看 964关注 0票数 0

我喜欢将语法保持在最通用的形式,方法是使用iminuit*参数。

代码语言:javascript
复制
import iminuit
import numpy as np

x_data = np.array([0,1,2,3,4,5,6,7,8,9])
y_data = np.array([0,1,2,3,4,5,4,3,2,1])

def fit_function(x, *p):
    return p[0]*np.exp(-((x-p[1])**2/(2*p[2]**2)))

def minimize_me(*p):
    return sum((fit_function(x, *p) - y)**2 for x, y in zip(x_data, y_data))

p=[4.5, 5, 0.4]
print(minimize_me(*p)) # works!  --> gives: 57.1645229329

m = iminuit.Minuit(minimize_me, *p)
m.migrad() # fails!

失败时出错:

代码语言:javascript
复制
AttributeError: 'float' object has no attribute 'print_banner'

你知道我做错了什么吗?谢谢。

附注:这个例子是基于这样的帖子:https://stackoverflow.com/a/22540079/5177935

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-02 21:10:44

有什么问题吗?

您正在像这样调用每分钟初始值:

代码语言:javascript
复制
p = [4.5, 5, 0.4]
Minuit(minimize_me, *p)

这相当于:

代码语言:javascript
复制
Minuit(minimize_me, 4.5, 5, 0.4)

也就是说,在Python中,星型导致了参数列表解包装,在本例中,传递浮点数作为不应该浮动的参数的位置参数:

代码语言:javascript
复制
Minuit(fcn=minimize_me, throw_nan=4.5, pedantic=5, frontend=0.4)

不正确地调用Minuit()应该立即失败,并给出一个很好的错误消息。目前没有,因为在初始化器中没有实现输入验证。感谢https://github.com/iminuit/iminuit/issues/189的报道。

该怎么做呢?

在您的例子中,您不关心参数名称。但是Minuit需要为每个参数都有一个名称。这是内部数据结构的一部分,例如用于报告fit的结果。

下面是一种处理此问题的通用方法:

代码语言:javascript
复制
p_vals = [4.5, 5, 0.4]
p_names = ['par_{}'.format(_) for _ in range(len(p_vals))]

m = iminuit.Minuit(
    fcn=minimize_me,
    forced_parameters=p_names,
    **dict(zip(p_names, p_vals))
)
print(m.parameters)
m.migrad()  # works!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40360615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档