Як вызначыць значэнне функцыі chi2 для адвольнай функцыі?

Я раблю некаторыя дадзеныя пасаджаныя з дапамогай прывязак pyminuit Python для кода мінімізацыі міну (http://code.google.com/p/pyminuit/). Minimiser прымае функцыю і выкарыстоўвае інтраспекцыя, каб атрымаць параметры павінны быць зведзены да мінімуму. Увогуле, я хачу, каб мінімізаваць хі квадрат значэння для набору дадзеных, зададзеных канкрэтную функцыю для апісання набору дадзеных.

Маё пытанне: Ці ёсць спосаб вызначыць квадрат функцыю хі які, улічваючы адвольную функцыю з пераменным лікам параметраў, вяртае функцыю, якая дае хі квадрат значэння для гэтай функцыі і ўтрымлівае толькі параметры для быць зведзена да мінімуму ў апісанні аргументу функцыі?

прыклад:

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) . Я не ведаю, што рабіць, як Данные_X і данные_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}

Дзякуй за вашу дапамогу загадзя!

2
Я б назваў той факт, што pyminuit здабывае параметры толькі інтраспекцыі і не дазваляе відавочна назваць ім, па меншай меры сумніўнай канструкцыі з боку pyminuit. Ці будуць яны дазваляюць даць параметры ў відавочным выглядзе, ваша задача будзе трывіяльнай вырашыць.
дададзена аўтар Sven Marnach, крыніца

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

друк

['a1', 'a2', 'a3', 'a4']
1
дададзена
У мяне было нешта падобнае напісана, але гэта значна больш кароткім і акуратна. Дзякуй!
дададзена аўтар almailer, крыніца