Keyfi fonksiyon için chi2 değeri fonksiyonu nasıl tanımlanır?

Minuit minimizasyon kodu (http://code.google.com/p/pyminuit/) için pyminuit Python bağlamaları kullanarak bazı veri uydurma yapıyorum. Minimatör bir işlevi kabul eder ve minimize edilecek parametreleri çıkarmak için iç gözlemi kullanır. Genel olarak, veri kümesini tanımlamak için belirli bir işlev verilen bir veri kümesi için ki kare değerini minimize etmek istiyorum.

Benim sorum: chi kare fonksiyon tanımlamak için bir yol var mı, değişen sayıda parametre ile rasgele bir fonksiyon verilen, bu fonksiyon için chi kare değeri veren bir işlev döndürür ve sadece parametreleri içeren işlev argüman belirtiminde minimize edilmek?

Örnek:

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) gibi bir şey yazmak istediğim yer burası. data_x ve data_y olarak sadece işlevin dışında ne yapılacağını bilmiyorum. Tamlık için minimizasyon rutininin geri kalanı şöyle görünür:

# 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}

Yardımınız için şimdiden teşekkür ederiz!

2
Pyminuit'in parametreleri sadece introspeksiyon ile çıkardığını ve Pyminuit'in üzerine en azından şüpheli bir tasarıma açıkça izin vermediğini söylerdim. Parametrelere açık bir şekilde izin verecekler mi, probleminiz çözmek için önemsiz olacaktır.
katma yazar Sven Marnach, kaynak

1 cevap

PyMinuit iç gözlemi kullandığı için, içgözlemeyi de kullanmalısınız. make_chi_squared() şu şekilde uygulanabilir:

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

Örnek kullanım:

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

baskı

['a1', 'a2', 'a3', 'a4']
1
katma
Yazılı bir şey vardı, ama bu daha özlü ve düzgün. Teşekkürler!
katma yazar almailer, kaynak