Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy非线性曲线拟合中的过拟合_Python_Scipy_Scikit Learn_Curve Fitting_Non Linear Regression - Fatal编程技术网

Python scipy非线性曲线拟合中的过拟合

Python scipy非线性曲线拟合中的过拟合,python,scipy,scikit-learn,curve-fitting,non-linear-regression,Python,Scipy,Scikit Learn,Curve Fitting,Non Linear Regression,我有一个模型方程,我们称之为eq_m: 我知道我的数据集如下,我正在尝试将我的数据拟合到eq_m,以便我可以使用拟合的参数来预测新的数据 然而,这个等式是非线性的,因此我使用scipy的曲线拟合来获得lambda、mu、sigma参数值,使用以下代码片段: opt_parms, parm_cov = o.curve_fit(eq_m, x, y,maxfev=50000) lamb , mu, sigm = opt_parms 我在不同的数据组上运行了这个模型,这些数据组都应该遵循这个模型,

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

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

然而,这个等式是非线性的,因此我使用scipy的曲线拟合来获得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\u fit
不支持正则化。它总是使用最小二乘成本函数。为了使拟合规则化,您需要编写一个自定义的成本函数来最小化

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

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
这将有望为您提供与曲线拟合类似的结果。(如果不是这样,则是开始调试的时候了。)

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

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
没有严格的必要对参数进行二次惩罚。基本上,您可以做任何事情,只要确保大参数会增加成本。结果将有所不同:-)

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