Оптимизация параметра путем минимизации ошибки хи-квадрат? - PullRequest
0 голосов
/ 16 апреля 2019

Мне нужно создать функцию, которая оптимизирует параметр beta, сводя к минимуму ошибку хи-квадрат.

Моим уравнением будет ошибка = vg (r) + (бета / 3) * H / (1 + z) r дельта (r)

У меня есть данные для vg (r), delta (r) и самого r. H и z - известные параметры, и я могу предположить, что это бета, но я точно не знаю, как реализовать это в python.

Я новичок в Python и могу использовать некоторую помощь

Я пытался использовать функцию scipy.optimize.minimize, но не могу заставить ее работать.

import numpy as np
from scipy import optimize as opt
import math

#parameters
z = 1.05352
bias = 1.85
h = 0.676
Om = 0.31
Ol = 1.-Om
pi = math.pi
H = 1.1


#beta = 0.47663662075855323
# ^this is a guess, I need this parameter optimized

def veldif(vr, delta):
    model = -beta/3*H/(1+z)**delta
    d = np.power((vr-model),2)
    quotient = np.divide(d ,model)
    chisquare = np.sum(quotient)
    return chisquare

result = opt.minimize(veldif,beta)

Ожидаемые результаты: оптимизированное бета-значение (скалярное значение)

фактические результаты: ошибка (похоже, ошибка при передаче значений через функцию «veldif», а также синтаксис функции «veldif».

1 Ответ

0 голосов
/ 05 мая 2019

Не очень понятно, какие у вас r, vg(r), delta(r) и как вы к ним обращаетесь.Однако в вашем фрагменте отсутствует первоначальное предположение для beta, которое должно быть переменной вашей целевой функции veldif, а не vr (если вы ищете оптимальную бета-версию).Что касается vg(r) and delta(r);Вы можете определить эти два как функции, которые принимают r в качестве входных данных и возвращают соответствующее значение.Это можно сделать следующим образом:

import numpy as np
from scipy.optimize import minimize


# examples for delta(r) and vg(r)
delta = lambda r:  3*r
vg    = lambda r:  2*r

def veldif(beta, r, H, z):
    model      = (-beta / 3) * (H / (1+z)**delta(r))
    chisquare  = np.sum((vg(r) - model)**2 / model)
    return chisquare

# parameters
z      = 1.05352
H      = 1.1
r      = 1
args   = (r, H, z)
beta0  = 0.2

# minimization
result = minimize(veldif,
                  x0   = beta0, 
                  args = args)
print(result)

Подробнее о том, как использовать scipy.optimize.minimize, см. В документах .

...