2011-10-28 6 views
2

minuit最小化コード(http://code.google.com/p/pyminuit/)のpyminuit Pythonバインディングを使用して、データフィッティングを行っています。ミニマイザは関数を受け取り、イントロスペクションを使用して最小化するパラメータを抽出します。一般的に、私は、データセットを記述する特定の関数を与えられたデータセットのカイ二乗値を最小限に抑えたい。任意の関数に対してchi2値関数を定義する方法は?

私の質問:さまざまな数のパラメータを持つ任意の関数を指定すると、その関数のカイ二乗値を与える関数を返します。およびは、関数の引数指定で最小化されますか?

例:

from scipy import * 
import minuit 
# Generate some data to fit 
data_x = arange(50) 
noise = 0.3 
data_y = data_x**3 + normal(0.0, noise) 
# Fit function, e.g. a cubic 
fit_func = lambda x, a1, a2, a3, a4: a1 + a2*x + a3*x**2 + a4*x**3 

# Minimisation function e.g. chi squared 
# Note this has only the parameters to be minimised in the definition (eg not data_x) 
min_func = lambda a1, a2, a3, a4: sum((fit_func(data_x, a1, a2, a3, a4) - data_y)**2/noise**2) 

私はmin_func = make_chi2(fit_func)のようなものを書きたいのですが場所です。 data_xdata_yは機能の外でしか定義されていないので、私は何をするべきかわかりません。事前にあなたの助けのための

# Initialise minimiser object with initial values 
m = minuit.Minuit(min_func, {'a1': 1.0, 'a2': 1.0, 'a3': 1.0, 'a4': 1.0}) 
# Run minimiser 
m.migrad() 
# Print minimised values - example output 
print m.values 
>>> {'a1': 0.000, 'a2': 0.000, 'a3': 0.000, 'a4': 1.000} 

ありがとう:最小化ルーチンの残りの部分は、完全を期すため、などが見えます!

+0

['a1', 'a2', 'a3', 'a4'] 
明示的にそれらをpyminuitの部分で少なくとも疑わしいデザインと名づける。彼らはパラメータを明示的に与えることができますか、あなたの問題は解決するのが簡単ではありません。 –

答えて

1

PyMinuitはイントロスペクションを使用するため、イントロスペクションも使用する必要があります。 make_chi_squared()は、このように実装することができます

import inspect 

chi_squared_template = """ 
def chi_squared(%(params)s): 
    return (((f(data_x, %(params)s) - data_y)/errors) ** 2).sum() 
""" 

def make_chi_squared(f, data_x, data_y, errors): 
    params = ", ".join(inspect.getargspec(f).args[1:]) 
    exec chi_squared_template % {"params": params} 
    return chi_squared 

使用例:

import numpy 

def f(x, a1, a2, a3, a4): 
    return a1 + a2*x + a3*x**2 + a4*x**3 

data_x = numpy.arange(50) 
errors = numpy.random.randn(50) * 0.3 
data_y = data_x**3 + errors 

chi_squared = make_chi_squared(f, data_x, data_y, errors) 
print inspect.getargspec(chi_squared).args 

印刷

私はpyminuitが唯一のイントロスペクションによってパラメータを抽出し、することはできませんという事実を呼びたい
+0

私はこれに書かれたようなものを持っていましたが、これははるかに簡潔できちんとしています。ありがとう! – almailer

関連する問題