O'zboshimchalik funktsiyasi uchun chi2 qiymat funktsiyasini qanday aniqlash mumkin?

Python bog'lamlari yordamida minitezni minimallashtirish kodi (http://code.google.com/p/pyminuit/) yordamida ba'zi ma'lumotlarga moslashayapman. Minimiser funktsiyani qabul qiladi va indrospeksiyani minimallashtiriladigan parametrlarni ajratib olish uchun ishlatadi. Umuman olganda, ma'lumotlar majmuasini tavsiflash uchun aniq funktsiyani hisobga olgan holda ma'lumotlar majmui uchun chi kvadrat qiymatini minimallashtirishni xohlayman.

Mening savolim: Chi kvadrat funktsiyani belgilashning bir usuli mavjudmi, u o'zboshimchalik bilan funktsiyani turli xil parametrlar bilan hisobga olgan holda, funktsiyani qaytaradi, bu funktsiya uchun chi kvadrat qiymatni beradi va faqat parametrlarni o'z ichiga oladi funktsiya dalillar spetsifikatsiyasida minimallashtirilsinmi?

Misol:

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 )

BU bu erda min_func = make_chi2 (fit_func) kabi biror narsa yozishni istayman. data_x va data_y kabi nima qilish kerakligini bilmayman faqat funktsiyaning tashqarisida. Minimallashning qolgan qismini to'liqligi uchun quyidagilar o'xshaydi:

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

Avvalgi yordamingiz uchun tashakkur!

2
Men pimentinuit parametrlarni faqatgina ichki tekshirish orqali chiqarib tashlaydi va ularni pyminuit qismida hech bo'lmaganda shubhali dizaynni aniq nomini berishga ruxsat bermaydi. Ular aniq parametrlarni berishga ruxsat beradimi, sizning muammoingiz hal qilish uchun ahamiyatsiz bo'ladi.
qo'shib qo'ydi muallif Sven Marnach, manba

1 javoblar

PyMinuit introspektsiya qo'llaganidan beri, siz o'zingizning ichki fikringizdan foydalanishingiz kerak. make_chi_squared() quyidagi tarzda amalga oshirilishi mumkin:

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

Misoldan foydalanish:

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

bosib chiqarish

['a1', 'a2', 'a3', 'a4']
1
qo'shib qo'ydi
Menda shunday yozilgan narsa bor edi, lekin bu juda ham qisqacha va chiroyli. Rahmat!
qo'shib qo'ydi muallif almailer, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming