【问题标题】:python iminuit attribute errorpython iminuit 属性错误
【发布时间】:2016-11-01 13:02:04
【问题描述】:

我喜欢通过使用*iminuit 提供其参数来保持语法最通用的形式:

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!

因错误而失败:

AttributeError: 'float' object has no attribute 'print_banner'

任何想法我做错了什么?谢谢。

附言此示例基于此 SO 帖子:https://stackoverflow.com/a/22540079/5177935

【问题讨论】:

    标签: python curve-fitting gaussian iminuit


    【解决方案1】:

    有什么问题?

    您正在像这样调用Minuit 初始化程序:

    p = [4.5, 5, 0.4]
    Minuit(minimize_me, *p)
    

    相当于这个:

    Minuit(minimize_me, 4.5, 5, 0.4)
    

    即在 Python 中,星号的结果是 argument list unpacking,在这种情况下,将浮点数作为不应该是浮点数的参数的位置参数传递:

    Minuit(fcn=minimize_me, throw_nan=4.5, pedantic=5, frontend=0.4)
    

    错误地调用Minuit() 应该会立即失败并给出一个好的错误消息。目前没有,因为在初始化程序中没有实现输入验证。感谢您通过 https://github.com/iminuit/iminuit/issues/189 报告此问题。

    怎么做?

    在您的情况下,您不关心参数名称。但是 Minuit 需要为每个参数命名。这是内部数据结构的一部分,例如用于报告拟合结果。

    这是处理此问题的通用方法:

    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!
    

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2013-07-01
      • 2011-10-12
      • 1970-01-01
      • 2016-05-01
      • 2021-07-24
      • 2012-10-31
      • 2018-10-29
      • 2015-11-20
      相关资源
      最近更新 更多