2016-11-01 14 views
0

私は*を使用してiminuitそのパラメータを与えることによって、その最も一般的な形で構文を維持したい:のpython 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の投稿に基づいています:https://stackoverflow.com/a/22540079/5177935

答えて

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! 
関連する問題