gpt4 book ai didi

python - scipy非线性曲线拟合中的过度拟合

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:50 25 4
gpt4 key购买 nike

我有一个模型方程,我们称它为 eq_m:

eq_m

我知道我的数据集遵循,我正在尝试将我的数据拟合到 eq_m,以便我可以使用拟合的参数来预测新数据。

但是这个 eq_m 是非线性的,因此我使用 scipy 的 curve_fit 来获取 lambda、mu、sigma 参数值,使用以下代码片段:

opt_parms, parm_cov = o.curve_fit(eq_m, x, y,maxfev=50000)
lamb , mu, sigm = opt_parms

我在本应遵循此模型的各种数据组上运行此模型,55/60 给了我很好的结果,但其余 5 个组高度过度拟合并预测了具有高正值的参数。有没有一种方法可以使用 scipy/numpy 或 scikit-learn 来规范曲线拟合并惩罚高幅度参数值?

我的主管建议使用共轭先验,但我在这里不知道该怎么做。

谁能帮我解决这个问题?如果我必须提供一个猜测来解决这个问题,有人可以告诉我如何计算这些猜测吗?

最佳答案

curve_fit 不支持正则化。它始终使用最小二乘成本函数。为了规范拟合,您需要编写一个自定义成本函数,您可以使用 scipy.optimize.minimize 将其最小化。 .

让我们首先将曲线拟合转化为最小化问题:

def eq_m(x, lamb, mu, sigm):  # assumed signature of eq_m
pass

def cost(params): # simply use globally defined x and y
lamb, mu, sigm = params
model = eq_m(x, lamb, mu, sigm)
return np.mean((model - y)**2) # quadratic cost function

p0 = [1, 0, 1] # initial guess for lambda, mu, and sigma
res = o.minimize(cost, p0)
print(res) # see if minimization succeeded.
lamb, mu, sigm = res.x

这有望为您提供与 curve_fit 类似的结果。 (如果不是这种情况,是时候开始调试了。)

现在我们可以使用成本函数来实现正则化:

def cost(params):
lamb, mu, sigm = params
model = eq_m(x, lamb, mu, sigm)
reg = lamb**2 + mu**2 + sigm**2 # very simple: higher parameters -> higher cost
regweight = 1.0 # determines relative importance of regularization vs goodness of fit
return np.mean((model - y)**2) + reg * regweight

没有严格的二次惩罚参数的需要。基本上你可以做任何事情,只要确保大参数会增加成本。结果会有所不同:-)

所有这些都是非常临时的方法,缺乏严格的理论基础。主管关于使用共轭先验的建议听起来像是他们希望您使用贝叶斯估计技术。尽管某些先验可以被认为等同于正则化,但该方法是完全不同的,并且在数学上相当复杂。您需要定义似然函数,定义参数的先验,然后使用贝叶斯规则组合它们以获得后验似然,而不是成本函数,您最终将其最大化。

关于python - scipy非线性曲线拟合中的过度拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com