参数估计中决策变量的对数变换

计算科学 优化 matlab 误差估计
2021-12-02 21:12:17

我试图找到扩散系数(D) 和分配系数 (KLP) 使用污染物从薄膜解吸到液体中的实验数据。在某些假设下,可以按照 Fick 定律对该过程进行建模(有关模型的更多详细信息,请参见此处的相关问题)

我正在使用 Matlab 的命令lsqnonlin从实验数据中查找这两个参数。一般来说,D范围在10161012m2/s然而KLP之间被理解103103

有时有人建议我将参数相乘,以便lsqnonlin必须处理的最低界限在 1 左右,这样绝对容差是可以接受的。因此,要找到的参数被转换为:

D=D·1016

KLP=KLP·103

我的直觉是使用对数转换,例如

D=log(D)

KLP=log(KLP)

是一个更好的解决方案。但我无法证明或看到对数转换的缺点(精度较低?)哪种转换更可取?有什么好处和坏处?

1个回答

如果进行转换以施加域约束,那么转换通常是一个好主意。使用参数的指数(因此存储日志,我认为这就是您的意思)是约束到正域的好方法,并且使用参数的 sigmoid 可以将其置于有界域中(并且您可以规定两端之间的锐度)。

通常,使用任何语言的 libm(数学库)都能够执行 log/exp/sigmoid/etc。到 1 ulp 所以真的没有太多的数字问题。事实上,通常情况正好相反:如果您的参数范围可以在 4 个数量级之间,那么进行对数变换可以减小该范围并使梯度在数值上保持更接近,这有助于控制舍入误差。

出于这个原因,即使用户没有明确说明,许多库实际上也在幕后进行转换。例如,如果您将 Stan 变量声明为正数,它会保存日志并根据需要进行取幂,以便 HMC 可以利用pR但是仍然严格地起作用(在这种情况下,这是非常必要的,因为如果不这样做,小的数值误差可能会使参数超出负数状态!)