非线性拟合 - 如何检查是否成功?概述:
如何检查非线性拟合是否成功?
(真实数据并不总是收敛,可能需要手动审查自动化/测试/产品问题。)
细节:
我想在非线性拟合无法收敛后编写响应脚本。如果拟合失败,我需要采用另一种方式进行处理,和/或最终贴上标签以供人工审核。 (我正在对总体进行采样,然后对每个部分进行非线性拟合。一般来说,如果我收敛失败,则说明某处存在测试问题;我实际上不想放松收敛标准。)
(“失败”消息:“失败:无法减少目标函数”)

仅限数值导数的修改脚本(帮助 > 脚本索引 >“<<非线性”)
(当前运行 JMP 15.2.1)
Names Default To Here( 1 );
dt = Open(
"$SAMPLE_DATA/Nonlinear Examples/US Population.jmp"
);
// Random, intentionally divergent, formula on this dataset
dt << New Column( "Random", Numeric, Formula( Random LogLogistic(5) ) );
dt << New Column( "FancyPredictionFormula",
Numeric,
Continuous,
Formula(
Parameter(
{Rth0 = 735, n = 0.5},
(:year / :pop) * ((1 - ((n - 1) * :pop * Rth0) / (:year
* (300 / :year) ^ n)) ^ (-1 / (n - 1)) - 1)
)
)
);
nonlinear = dt << Nonlinear(
Y( :Name( "Random" ) ),
X( :Name("FancyPredictionFormula") ),
Expand Intermediate Formulas( 1 ),
Numeric Derivatives Only( 1 ),
QuasiNewton SR1,
Interation Limit(50),
Finish,
Plot( 0 ),
Confidence Limits,
Save Estimates
);
// How to check if nonlinear fit succeeded?
理想的。
我认为,如果非线性拟合平台在某处返回一个 bool 状态变量指示成功或失败,那么这将是验证成功的理想方法。
替代方案 1。
我还可以对数据进行制表或汇总,看看是否所有的:姓名( 《花式预测公式》 )值为零。(如果拟合失败,值似乎为 0)。
替代方案 2。
可能有一种方法可以检查 XML 并读取“失败”消息。
感谢您的时间和考虑。
-奥布里
自动化和脚本编写回复:非线性拟合 - 如何检查是否成功?未能收敛的常见罪魁祸首是起始参数值。 当可用时,使用特定于域的启发式方法来初始化它们通常就足够了。
回复:非线性拟合 - 如何检查是否成功?你离我要去的地方更近了。
我一直在与:
if (contains(alltext, "Failed"), caption ("Failed: Do additional action now ..."));总的来说,但我正在考虑添加更多的 case 语句(或者我猜是多个“if”),以专门处理失败原因。</CODE></P><P><CODE class=" language-jsl">
例如,如果我发现这个失败原因,我可以以更高的迭代次数再次运行:
contains(alltext, "Maximum Iteration Exceeded");
真正的动机是,“大多数”部分将通过数值方法进行收敛,但有些部分似乎需要分析。我不确定发生了什么导致这种情况。收敛标准?但“修复”是在没有数值导数的情况下再次运行,例如:
nonlinear = dt << Nonlinear(
Y( :Name( "Random" ) ),
X( :Name("FancyPredictionFormula") ),
Expand Intermediate Formulas( 1 ),
Newton,
Finish,
Plot( 0 ),
Confidence Limits,
Save Estimates
);捕获后:
contains(alltext, "Cannot Decrease Objective Function");
回复:非线性拟合 - 如何检查是否成功?我想知道是否更好的检查是文本是否除了成功之外还有其他内容:
If( Not( Contains( alltext, "Converged" ) ),
// trap failure
,
// proceed after success
);
回复:非线性拟合 - 如何检查是否成功?这样就可以了。谢谢杰德!
回复:非线性拟合 - 如何检查是否成功?这是使用替代方案 2a 的方法(从报告中删除文字)。 前两行执行实际工作,第三行只是一个如何处理信息的简单示例;对于这一部分,您可能还有其他想法。
// How to check if nonlinear fit succeeded?
r = nonlinear << report;
alltext = r[Outline Box("Control Panel")] << get text;
if (contains(alltext, "Cannot Decrease"), caption ("Failed: Cannot Decrease ..."));