Еркін функция үшін chi2 мән функциясын қалай анықтауға болады?

Мен минимумды азайту коды (http://code.google.com/p/pyminuit/) үшін pyminuit Python байланысы арқылы кейбір деректерді орналастыруды жасаймын. Минимизатор функцияны қабылдайды және азайтылатын параметрлерді шығару үшін интроспективаны пайдаланады. Жалпы алғанда, деректер жиынтығын сипаттау үшін белгілі бір функция берілген деректер жиынтығына арналған chi квадрат мәнін барынша азайтуды қалаймын.

Менің сұрағым: Әртүрлі сандар параметрлерімен ерікті функцияны ескере отырып, функцияны қайтаратын функцияны қайтаратын әдіс бар ма, яғни және функциясы үшін chi квадрат мәнін береді, тек функция дәлелінің сипаттамасында азайтылсын ба?

Мысал:

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_x және data_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
Мен пиминут параметрлерді интроспекция арқылы ғана шығарып тастайды және оларды пиминуттың бөлігінен кем дегенде күмәнді дизайнды атауға мүмкіндік бермейтінін айтайын. Параметрлерді айқын түрде беруге мүмкіндік берер ме, сіздің проблемаңыз шешілмеген мәселе.
қосылды автор 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, көзі