非线性方程组的最小二乘回归你好 - 我有一个中等复杂的物理过程模型(离子吸附对于任何知道这意味着什么的人来说)。 我有两个起始变量 x1 和 x2,以及两个随 x1 和 x2 变化的测量结果 y1 和 y2,以及不可测量或难以测量的变量 g1,...,gn 不会改变。 对于系列中的每一行,x1 和 x2 中的一个或两个也可以更改。 我有一组非线性方程 s = f(x1, x2, y1,...,y2, g1,...,gn),以及 f 中不同变量的一些其他函数,具体取决于我的复杂程度想要的模型是。 请参阅附件中的示例方程。
我们执行此操作的典型方法是在 Matlab 中使用 lsqnonlin。 效果很好,但是跑起来很麻烦。 我宁愿有一个(不那么简单)列公式。 但是,我不完全确定如何编码。 非线性回归是为单个方程构建的,并且三个方程都描述相同的 s,看起来递归会很多。 我也不确定损失函数是什么。 在matlab中,我们输入猜测值,计算猜测值和计算值之间的最小二乘,如果所有猜测值和方程的平方差之和超出某个公差,则更新它,然后循环。 我假设这是由非线性平台在内部完成的,但是我的目标是否为零,因为我希望平方差之和为零? 或者如果没有,我该如何做多个方程?
如果这比我想象的简单得多,我深表歉意。
高级统计建模视窗回复:非线性方程组的最小二乘回归我建议的一种方法是定义适当的丢失函数的老技巧。 在您的情况下,丢失的功能可能是:
(s-f1(...))^2 + (s-f2(...))^2 + (s-f3(...))^2 + ...
每个元素都是系统中方程的平方误差。 您对它们进行总结,并将总体误差最小化。 该方法将非线性最小二乘问题转换为损失函数优化问题。
同时,我认为对方程组使用非线性最小二乘仍然是可行的。 步骤如下:
- 扩展您的数据表。 对于每一行,您都会复制它,并且副本的总数与系统中方程的数量相同。 这加入可能对这项任务有用。 您需要创建一个 Freq 列,其单元格值为方程的数量。
- 现在您需要创建那个不那么简单的公式列。 根据上一步中行的排列方式,您可能需要以不同的方式编写公式。 但目标如下。 对于原始行的每个副本,将其分配给系统中的一个方程。 因此,最终,行的每个副本都与系统中的不同方程相关联。 您可能需要弄清楚如何将行号与方程号关联起来。 如果副本位于连续行中,如上述加载项的结果,您可能需要“Modulo”函数来进行映射。
最后,使用您所知道的非线性来解决最小二乘问题。
回复:非线性方程组的最小二乘回归我有一些代码用来模拟水分吸附过程 - 它寻求多个物理模型所描述的平衡条件 - 我将看看是否可以制作一个可以在此处分享的代码的通用版本。
回复:非线性方程组的最小二乘回归你好@peng_liu感谢您的答复,并对延迟回复表示歉意! 论文+两个月大的宝宝让你忘记跟进事情。
您会选择什么作为 s? 我没有测量任何s,在matlab代码中,我们猜测一个s,然后更新。 您建议如何这样做?
至于最小二乘法,看起来很有趣。 您是否有为另一个项目制作的表格,我可以看看它可以做类似的事情? 对于我所有的脚本,我没有对基于行的公式做太多事情,而且当我这样做时,我已经失败了。
回复:非线性方程组的最小二乘回归你好@大卫_伯纳姆- 是的,如果您有一个通用版本,那将非常有帮助。回复:非线性方程组的最小二乘回归恭喜!
所以,“s”在这里是一个未知参数。 在这种情况下,将所有方程重写为:0 = f(...) - s。
或者,如果方程中的量已知,请将它们移到左侧。 当您使用非线性平台时,左侧将是您的 Y。
我没有例子,所以我编了一个。 附:eqns.jmp的废话系统
它有
- Y 列,已知数量。
- 公式列,右侧的内容是方程的大小
- 标签列表示奇数行对应第一个方程,偶数行对应第二个方程
- 作为右侧方程一部分的其他已知量。
查看“公式”列中的公式,了解如何在单个列中分配两个方程。
回复:非线性方程组的最小二乘回归感谢您的指导@peng_liu !
我已经整理了一个表,如果我有几行,它似乎可以工作,但如果我尝试做更多的事情,它会给我这个:

这确实是行数太多的问题吗? 如果我将行数减少到最少(本例中为 3 行),并且我必须创建一个新表,则该错误似乎仍然存在。 您对此有什么想法吗? 这是我用模型的准系统版本制作的表格,因此并不麻烦。 我还将参数放入自己的列中(Phi0、sigma0、pHf)并扩展了中间公式,以便更轻松地查看列公式。
回复:非线性方程组的最小二乘回归我不确定如何使用此数据表运行非线性平台。 哪个是Y,哪个是X?
但如果“公式”列是X,我认为它不会起作用。 X的公式必须使用参数,而不是表变量。
下面是那个“废话数据表”中X列的样子。

您的“公式”列在参数下没有列出任何内容。
回复:非线性方程组的最小二乘回归嘿@peng_liu - 是的,因为参数使公式长了 100 倍,所以我将它们转储到 Phi0、sigma0 和 pHf 列中(标题为“.”的列后的第 6-8 列),然后选择非线性平台底部的“展开中间公式”框。 这样我就可以使用参数,但它们不会使公式列无法使用,因为每个参数都有很多“扩展类别”。
那有意义吗?
所附的屏幕截图应显示这些列及其在公式中的位置,以便更清晰地显示。
回复:非线性方程组的最小二乘回归@peng_liu我还要说的是,我发现 1)仅数值导数选项似乎确实可以使其进入主平台,2)当我在多个方程中具有参数时,似乎给出了错误。 不确定这是否告诉你什么。 我只是找不到该错误的参考,所以我很困惑。
回复:非线性方程组的最小二乘回归谢谢你的解释, @ehchandler我明白你现在在做什么。 对于如此复杂的问题,你正在做的事情是一个很好的技巧。 对我来说有些新东西!
我查看了错误消息。 您需要选中“仅数值导数”。

您有 300 多个参数,底层符号导数已达到极限。
我看到你有 337 行,但有 339 个参数。 这个子集不会得到解决方案。 希望您的全套没有问题。
与此同时,当我查看你的设置时,发现了一些有趣的事情。 我不知道你的主题。 但在您的设置中,Phi0、sigma0 和 pHf 是 pH0 的离散函数。 三者与pH0之间的关系已知吗? 如果其中已知连续关系(具有较少的未知参数),则可能会大大减少参数的数量。
回复:非线性方程组的最小二乘回归@peng_liu好吧,这更有意义。 您是否知道符号导数代码中项或参数数量的限制? 因为我想我可以只拥有一个包含几个数字的列,然后使用“by”功能对计算进行分段。 符号导数的速度要快得多。
嗯。 不确定新参数从哪里来。 我进去后会检查一下。 感谢您注意到这一点。 三个相关问题:1)您是如何看到参数数量的?2)在列公式菜单中是否可以批量删除参数? 据我所知,你必须右键单击,单击删除一项一项。 3)有没有办法使用表格来输入参数及其界限? 这确实有助于加快速度。
谢谢!
回复:非线性方程组的最小二乘回归限制不在于参数数量。 但参数的数量是你的情况的一个因素。 所以,你必须尝试看看。
我看到您的系统具有三种不同类型的参数:Phi、sigma、pHf。 它们都以 pH0 值为条件。 因此,不同pH0下的参数是独立的。 所以,你是对的,做“By”拟合可以降低复杂性。
PS“By”没有按我的意愿工作。 所有行都可以看到列中的所有参数。 我不认为可以让 By 中的各个行仅查看参数的子集。
启动非线性后我看到了参数的数量。 有一个参数的能力。 我右键单击并从中创建一个表,计算行数。 对于最后两行,我建议只编辑 JSL 公式。 打开列的公式编辑器。 复制它,然后粘贴到 JSL 编辑器中。 编辑完成后,复制并粘贴回来。 通过这样,您可以编辑参数列表:
“1”部分是您的参数列表。 “2”是实际的公式。

回复:非线性方程组的最小二乘回归跟进如何使用“By”。
似乎有一种方法可以使用 By 并减少参数数量以利用行之间的独立性。
我附上“废话系统”的v2。 首先解释一下我设置的内容。

我建立了两个线性方程组。 第 1 行和第 2 行是系统“a”,即组列。 第 3 行和第 4 行是系统“b”。
每个线性系统都有两个参数“b0”和“b1”,但它们在系统之间是不同的。 我使用参数 x1 和 x2 来生成“SimY”。 我将 SimY 复制到 Y 进行分析。
现在看看“公式”列,我不按组区分“b0”和“b1”。

现在使用 By = Group 运行非线性。 这是报告:

它为各个系统找到单独、正确的解决方案。
回复:非线性方程组的最小二乘回归@peng_liu是的,我也遇到了问题。 你的解决方案看起来不错! 但是,当我尝试将其应用到我的表时,它出错了。 您在附表中看到一个明显的问题吗? Phi0、sigma0 和 pHf 与以前相同。 但是,我为您提到的“按”方法创建了“循环分类”列,但随后有一个“按列参数”。 我使用此列的级别来按类别扩展参数。 由于 :Cyclic Categorization 和 :Parameter by columns 是正交的(或者无论正确的词是什么),这应该允许参数以微小的偏移量迭代整个曲线(pH0 是 x 轴),然后我可以将它们放在一起再次在最后。 然而,就像我说的,它失败了并且只更新了参数的一个级别,并且不知道为什么。
这可能是 by 如何与按类别扩展的参数交互的问题吗?
回复:非线性方程组的最小二乘回归Column3 中缺少值,这解释了为什么只有一组有结果。 但“公式”并没有按照我推荐的那样设置。 我附上 test.v2 来说明。 通过这种方法,您不再需要中间的 Phi0、sigma0 和 pHf。
回复:非线性方程组的最小二乘回归@peng_liu哦,呃。 不知道我是如何错过那么多缺失的行的。 感谢您注意到这一点。
所以也许我误解了,但由于 pH0 是我的 x 轴,你的解决方案是否意味着 by 列是 x 列?就像如果你有 100 个值,那么你就有 100 个“组”?
如果是这样,那么按列扩展版本不是更好吗,因为您正在最小化多个点上的错误,而不是只是每个点的自包含最小化? 或者逐点处理损失函数是更好的方法? 我只是将我必须的 matlab 代码拟合到 JMP,但并没有最小化算法方面的专业知识,所以无论最好的技术是什么,我都会支持。
聚苯乙烯 也许我没有说清楚,但每个 pH0 值(即因变量)的每个参数都应该有一组唯一的值。 这就是为什么我认为我需要按类别进行扩展。
谢谢!
回复:非线性方程组的最小二乘回归我看到原始表中的“公式”列取决于 pH0。 但 test.jmp 中的“公式”列不依赖于 pH0。 我想这是我们之间的一个误会。 让我仍然使用你的原始数据,所以 Phi0、sigma0、pHf 取决于 pH0,而不是“按列的参数”。
我们看一下前三行:

它们的 pH0 = 0.2。 因此,第一行的公式可以表示为:
f1(Phi0_pH0_0.2,sigma0_pH0_0.2,pHf0_pH0_0.2)。
第二行和第三行公式为:
f2(Phi0_pH0_0.2、sigma0_pH0_0.2、pHf0_pH0_0.2) 和
f3(Phi0_pH0_0.2,sigma0_pH0_0.2,pHf0_pH0_0.2)。 这三行构成第 1 组。
现在看第 4、5、6 行。 它们的 pH0 = 0.3。 所以这三个公式是:
f1(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3),
f2(Phi0_pH0_0.3、sigma0_pH0_0.3、pHf0_pH0_0.3),以及
f3(Phi0_pH0_0.3,sigma0_pH0_0.3,pHf0_pH0_0.3)。 这三行构成第 2 组。
Group1 和 Group2 不共享同一组参数。 他们是独立的。 最小化 Group1 的错误与最小化 Group2 的错误无关。 所以,我们可以逐组优化。
如果将三个中间列中的参数设置为 Phi0_pH0_0.2、Phi0_pH0_0.3、Phi0_pH0_0.4 等,则每一行都会看到所有这些参数。 您可以看到,如果您按 pH0 运行非线性,则每组都会列出数百个参数。 但其中,每行只有三个相关,并且每三行相关。
我所做的只是在“公式”列内创建三个参数。 我将它们命名为 paramPhi0、paramSigma0、parampHf。 即使只有三个,当我们通过“pH0”运行非线性时,平台也会通过“pH0”创建不同的三个参数集。 它实际上是通过“pH0”为您创建了数百个参数。 pH0 的每个小非线性只需要担心三个参数。