通过最小化卡方误差来优化参数?

2024-10-02 04:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个函数,通过最小化卡方误差来优化参数beta。你知道吗

我的公式是误差=vg(r)+(beta/3)*H/(1+z)rdelta(r)

我有vg(r)、delta(r)和r本身的数据。H和z是已知的参数,我可以猜测beta版,但我不知道如何在python中实现这一点。你知道吗

我是python新手,需要一些帮助

我试过用scipy.优化.最小化功能,但似乎无法让它工作。你知道吗

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)

预期结果:优化的beta值(标量)

实际结果:error(似乎是通过“veldif”函数传递值的错误,以及“veldif”函数的语法错误。你知道吗


Tags: 函数import参数modelasnpmathscipy
1条回答
网友
1楼 · 发布于 2024-10-02 04:27:37

现在还不太清楚你的r, vg(r), delta(r)是什么,你是如何访问它们的。但是,您的代码片段缺少beta的初始猜测,它应该是目标函数的变量veldif,而不是vr(如果您正在搜索最佳beta)。至于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的更多信息,请参阅docs。你知道吗

相关问题 更多 >

    热门问题