我有问题(见https://public.jmp.com/packages/Problematic-Nonlinear-Fit/js-p/kz0BFg2_XHtZjz6kNKdXg ) 我正在拟合非线性模型,并且由于数据的原因,模型拟合存在一些不稳定性。当与真实的理论模型相比,数据中存在小的误差时,非线性模型中的参数之一往往会“滑向无穷大”。我想做的是拟合非线性模型,但对该参数(例如 L2 范数)施加惩罚,以防止参数爆炸。
我的意思是:
假设我的非线性模型是
f(t) = A * (1 - exp(-k*t)) + B * (1-exp(0.0193 * t))
通常,为找到参数估计而最小化的损失函数是平方误差损失
find(A, k,
使得 sum { (yf(t))^2) } 最小化
我想做的是更像
find(A, k,
使 sum{ (yf(t))^2 + lambda*k^2} 最小化
其中 lambda 是一个正则化参数,我会根据简单的网格搜索自行选择。
我研究了使用自定义损失函数列,但我不知道是否可以在该列中包含来自另一列的模型参数。
关于如何防止费率(“k”)爆炸的任何想法?
我尝试使用数值导数,但这并没有改变结果。参数界限会按照您的想法进行,只需将估计值设为指定界限即可。
我也在这篇文章中上传了示例数据。
我确实想到了一种方法来做到这一点,使用预测分析器。这是我的方法:
我创建了一个表(见附件),其中包含我想要最小化的“损失”函数的列 k、A、B、lambda 和列。附表有 2 个损失函数(QuadLoss 和 L2RegLoss)。这些列中的每一列都有一个更复杂的脚本作为公式。我将轮廓数据存储为矩阵,将 y 和 t 值提取为向量,然后计算 y 与模型之间的差异(完成将模型写为 t、k、A 和 B 的函数)。然后我计算平方误差之和加上任何添加的正则化惩罚作为最后一个结果。lambda 的值会缩放惩罚值。我“矢量化”了这个函数,只是为了让它更容易编写。这是 QuadLoss 的函数:
dmat = [0.061033 3, 0.0706 6, 0.0923 12, 0.104767 24, 0.122933 48, 0.1657 120, 0.2201 240];
yvec = dmat[0, 1];
tvec = dmat[0, 2];
rvec = yvec - (:A * (1 - Exp( -:k * tvec )) + :B * (1 - Exp( -0.0193 * tvec )));
(rvec` * rvec)[1];
这是 L2RegLoss 的函数
dmat = [0.061033 3, 0.0706 6, 0.0923 12, 0.104767 24, 0.122933 48, 0.1657 120, 0.2201 240];
yvec = dmat[0, 1];
tvec = dmat[0, 2];
rvec = yvec - (:A * (1 - Exp( -:k * tvec )) + :B * (1 - Exp( -0.0193 * tvec )));
(rvec` * rvec)[1] + :lambda * :k ^ 2;
然后,使用 Prediction Profiler 和一个期望函数来最小化损失,我查看了 lambda(正则化调整参数)的不同值对 k 值的影响。在这种情况下,我只是正则化 k,而不是 A 和 B。

“NoReg”保存的设置只是使用二次损失(平方误差之和),这应该类似于非线性平台正在做的事情(但不完全是,因为在这种情况下,我正在使用分析器中的优化例程,它我很确定与非线性平台使用的不同)。然后我为 lambda 尝试了 0.01、0.001、0.1 的值,并且 k 的估计值受调整参数值的影响很大。所以我对这种方法并不完全满意。调整参数的选择具有挑战性,不确定这是否是一种合理的方法。
我想了很久这个问题,但我看不出如何显示当前参数值,以便它们可以用于正则化损失函数。 有可能跳过预测公式并在损失函数中表达整个模型。 据我所知,自定义损失函数是一个弱点。
有一个内置功能可能有助于代替正则化。 看帮助 > JMP 文档库 > 预测和专业建模 > 非线性回归 > 其他示例 > 设置参数限制的示例. 此解决方案的问题在于您的参数可能只是以上限而不是无穷大结束。
您是否尝试过一些非默认设置来提供帮助? 我怀疑是否仅限数字导数有助于? 会使用二阶导数选项帮助?