这是关于如何将分段连续函数拟合到数据集的系列文章中的第三篇。 我将在每篇文章的开头提供指向该系列所有其他文章的链接。 他们是:
进入第 3 部分...
介绍
如果您已经阅读了本系列中我之前的帖子,您就会知道我们现在已经开发了包含 10 个未知参数的方程,这些参数需要确定以最好地拟合示例问题的各个部分。 我们如何做到这一点JMP ?
首先,我们需要使用 JMP 的公式编辑器来输入我们的方程和未知参数。 我假设读者通常熟悉公式编辑器。 (如果没有,这里有一个关于创建公式的短视频和一个更长的视频,在公式编辑器上有更多的细节.)
在 JMP 的公式编辑器中设置参数
您可能不知道的是公式编辑器中设置参数的能力。 参数是您正在创建的公式的局部变量。 它们是通过下拉菜单访问的(默认是表变量,切换到参数,如图 1 所示。)
图 1:在公式编辑器中访问参数
这将提供一个选项,用于向公式添加“新参数”。 让我们做一个简单的例子,并在参数列表中添加一个名为“a0”的参数。 单击 New Parameter,然后将参数名称更改为“a0”,并将其值为 1:
图 2:创建一个新参数并为其赋予初始值
- “名称”是任意的。 您可以选择任何有效的 JSL 变量名称。
- “值”是该参数的起始值。 你必须给出一个起始值。 有时(取决于您选择的公式),起始值可能很重要,并且应该选择接近您可以猜测的真实值。 (这有助于防止以后出现收敛问题。)在这种情况下,我不知道该值应该是多少,因此我将随意选择一个起始值 1。
现在我们可以在公式中使用这个新的“a0”参数,就像它是一个列变量一样。 让我们简单地将它添加到标记为“y”的列中的值。 双击参数列表中的 a0(它应该出现在公式面板中),然后键入“+”,然后双击列列表中的“y”。 这应该给出以下公式:
图 3:在公式中使用参数
现在当我们点击 OK 并查看数据表中的结果时,我们有
图 4:在公式中使用参数的结果
因此,公式现在识别 a0 参数的当前值并相应地应用它。 当我们使用 JMP 非线性平台求解未知参数时,将在下一篇博文中使用这个重要概念。
为分段函数输入参数
在本博客系列的第 2 部分中,我们开发了五个简单的多项式,以应用于示例数据系列中的断点之间。 这些多项式有六个未知参数: a0、b1、b2、c1、d1 和 d2。 我们还有四个分割点定义了多项式处于活动状态的区域:X1、X2、X3 和 X4。 我们需要将这些参数中的每一个添加到我们的公式参数列表中,以及合理的起始值。 完成后,参数列表如下所示:
图 5:为我们的分段示例输入和初始化的所有十个参数
请注意,我假设多项式中的每个系数的起始值为“1”。 对于断点 X1 到 X4,我选择基于我认为它们可能出现的“眼球”来估计值。 这只是为 JMP 提供了一个更好的起点来开始寻找断点。
输入分段公式 - 包括布尔技巧!
现在您知道如何在公式编辑器中设置参数,并且您也知道如何将第 2 部分中显示的五个分段方程中的任何一个输入到公式编辑器中。 但是我们如何将所有五个分段方程输入到同一个公式中?
一种方法是使用大的 IF 语句,例如“如果 x@PatrickGiuliano ,他在之前的 JMP 社区讨论主题中发布了一个有用的技巧。
JMP 识别布尔运算符(And、Or、Nor 等)。 如果在公式中使用布尔运算符,则布尔逻辑在为真时返回 1,如果为假则返回 0。 所以我们可以设置一个运算符,例如 (X1<:x & :x<=X2)。 如果“x”列中的值(在表达式中称为“:x”)在参数 X1 和 X2 之间,则此运算符返回 1,否则返回 0。 所以我们可以简单地将 X1-X2 段的分段方程乘以上述布尔表达式。 如果 x 的值在适当的范围内,则激活分段方程。 如果不是,我们返回 0。 然后我们将对所有其他范围做同样的事情,并将所有方程相加。
如果我们完成所有这些,我们最终会得到一个如下所示的公式:
图 6:完整的分段公式(在公式编辑器模式下显示)
以下是 JSL 输入格式的相同信息,如果您愿意:
图 7:完整的分段公式(以 JSL 模式显示)
总而言之,在图 6 和图 7 中,我们基本上在一个新列(称为 ypred)中构建了一个公式:
- 定义将在公式中使用的 10 个未知参数(并给每个参数一个适当的起始值)。
- 描述四个分段方程,每个方程都使用其适当的参数。
- 通过乘以描述每个方程范围的适当布尔不等式激活每个分段方程。
- 将四个方程相加得到最终公式。
很酷...
系列中的下一个
下一次,我们将最终使用非线性平台的方程来求解最佳拟合参数。 我们还将讨论收敛标准和算法的选择。
你好@JerryFish ,到目前为止,我真的很喜欢这些博客文章!对于不是每天都在做参数优化的人,很高兴有这个资源可以回顾一下,以便重新了解如何做,以及如何处理更高级的案例,比如这里介绍的分段非线性拟合。
与这篇文章相关的快速问题:如果我想生成在“时间”内产生逐渐增加(或减少)趋势的模拟数据(为简单起见,我们可以使用行顺序)我如何在 JMP 中对其进行参数化? (或者有没有更简单的方法不使用模型参数化,例如结合即时列公式?)。
谢谢!@PatrickGiuliano