python iminuit 属性错误
python iminuit attribute error
我喜欢通过使用 *
:
给 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'
知道我做错了什么吗?谢谢。
p.s。这个例子是基于这个 SO post:
有什么问题?
您正在这样调用 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!
我喜欢通过使用 *
:
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'
知道我做错了什么吗?谢谢。
p.s。这个例子是基于这个 SO post:
有什么问题?
您正在这样调用 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!