“非线性”平台对于具有最常见运算的公式求符号导数。本节将说明生成的导数表达式类型。
若您打开 Negative Exponential.jmp 非线性样本数据示例,非线性列的实际公式类似于以下公式:
Parameter({b0=0.5, b1=0.5}, b0*(1-Exp(-b1*X)))
若您使用公式编辑器,则公式中的 Parameter 部分是隐藏的。这说明了公式在列中的储存方式以及在“非线性”启动对话框中的显示方式。公式中给出了名为 b0 和 b1 的两个参数的初始值,在公式中供拟合使用。
“非线性”平台生成公式的单独副本,并对它进行编辑以提取表达式中的参数。然后它将对这些参数的引用映射到估计参数的位置。“非线性”平台对预测公式的参数计算分析导数。若您使用显示导数命令,则可以获得日志中所列的公式,它类似于以下内容:
预测模型:
b0 * First(T#1=1-(T#2=Exp(-b1*X)), T#3=-(-1*T#2*X))
模型的对于参数的导数为:
{T#1, T#3*b0}
导数工具的工作机制如下所示:
• 为了避免重复计算子表达式,预测模型通过对线程赋值来储存导数计算所需的子表达式的值。这些赋值命名为 T#1、T#2 等。
• 预测模型需要计算更多子表达式时,它使用 First 函数来返回第一个参数表达式的值,同时也会计算其他参数表达式的值。在这种情况下,需要更多赋值来计算导数。
• 导数表本身是表达式的列表,每个要拟合的参数对应于一个表达式。例如,模型的对于 b0 的导数为 T#1,它在预测模型中的线程为 1–(Exp(-b1*X))。模型的对于 b1 的导数为 T#3*b0,若您对上述赋值中进行了替换,则它的线程为 –(–1*Exp(-b1*X)*X)*b0。尽管进行了很多优化,它有时并不能以最优方式组合运算。您从 T#3 的表达式中可以看出,该表达式并未消除双否定运算。
若您指定损失函数,则公式编辑器会对参数求导(若有的话)。若有一个参数,则求模型的一阶导数和二阶导数。
若导数机制不知道如何求函数的分析导数,则使用 NumDeriv 函数求数值导数。若求数值导数,平台会显示 delta 的值,它用于计算当参数表达式变化 delta 的时候,函数的相对变化量。您可能需要试用不同的 delta 设置以获得好的数值导数。
始终有很多方法来表示给定的模型,一些方法的性能要比其他方法好很多。Ratkowsky (1990) 在文章中提到了替代方法。
若您有重复的子表达式,而它出现在公式的好几个地方,则最好将它赋值给一个临时变量。随后便可在公式中引用它。例如,上面的一个模型公式是这样的:
If(Y==0, Log(1/(1+Exp(model))), Log(1 - 1/(1 + Exp(model))));
该公式可以通过提取一个公共表达式并将它赋值给一个局部变量来进行简化:
temp=1/(1+Exp(model));
If(Y==0, Log(temp), Log(1-temp));
导数工具可以在不同赋值和条件下追踪导数。