【发布时间】:2019-05-19 01:28:33
【问题描述】:
我的问题是关于由不同参数函数组成的复杂模型的拟合参数。
更准确地说,我想描述一个复杂的实验。
实验产生一个一维数组的测量数据data,其中每个条目对应于(一组)实验控制变量x。
我现在是一个理论模型(实际上是多个模型,见下文)model(x,pars),它采用x 和很多参数pars 来预测data。但是,并非所有参数都是已知的,我需要拟合它们。
此外,模型的一些细节还不确定。正因为如此,我实际上有一系列的多个模型,它们在某些部分非常相似,但模型的某些内部组件不同(但模型的很大一部分是相同的)。
不幸的是,将一个组件切换到另一个组件可能会引入新的(未知)参数,即我们现在有 modelA(x,parsA) 和 modelB(x,parsB)
有不同的参数。
模型基本上由函数f(x, pars, vals_of_subfuncs)组成,其中x是自变量,pars是f的一些显式参数,vals_of_subfuncs是评估一些低级函数的结果,它们本身取决于它们自己的参数(也可能是它们自己的低级函数的结果等)
显然,没有递归是可能的,并且在最低级别的函数中不依赖于其他函数的值。
这张图最能说明情况:
自变量为x(蓝色),参数为a,b,c,d(红色),子函数的值在代表函数的节点中显示为绿色箭头。
在 (1) 中,我们有一个没有子函数的最低层函数 G(x; (a,b); {}) 和一个更高层函数 F(x; c; G(x; (a,b)),其评估给出了模型结果,这取决于 x 和 pars=(a,b,c)。
在 (2) 和 (3) 中,我们分别更改模型的组件 (F->F') 和 (G->G')。这改变了最终模型的参数依赖性。
现在我正在寻找一种最pythonic/模块化的方法来解决在这种情况下实现参数拟合的问题,而不必每次交换/更改模型的组件时都重新编写拟合函数,从而可能引入一个新参数。
目前,我正在尝试使用lmfit 找到解决此问题的方法。我还考虑过可能尝试使用sympy 来处理符号“参数”,但我认为并不是所有出现的函数都可以轻松地写成asteval 可以评估的表达式。
有谁知道处理这种情况的自然方法?
【问题讨论】:
标签: python curve-fitting model-fitting lmfit