【发布时间】:2013-04-24 03:33:26
【问题描述】:
我做了很多 ODE 模拟,并使用了一些 Python 参数优化工具(例如 scipy.optimize.minimize、emcee),这些工具需要将参数作为列表传入。这使得它们非常麻烦,因为我必须将参数称为params[0]、params[1] 等,而不是更直观的名称来实际描述它们在模拟中的作用。到目前为止,我对此的解决方案是这样的:
k1 = 1.0
k2 = 0.5
N = 0.01
params = [k1,k2,N]
def sim(params,timerange):
k1 = params[0]
k2 = params[1]
N = params[2]
# run the simulation
这真的很笨拙,并且由于多种原因而令人不满意。每当我需要向模拟添加新参数时,我都必须修改参数列表并更改我在模拟函数中手动解包列表的方式;浪费一些时间在每一轮模拟等中建立新的参考。
我想知道是否有一个理智的、非笨拙的解决方案来定义带有名称的参数,将它们作为列表传递给函数,然后通过列表中的相同名称引用它们。
【问题讨论】:
-
您能否进一步解释一下您在
sim函数中所做的工作?具体来说,我希望看到您在哪里调用 scipy 或 emcee 函数,以便我们更好地了解需要传递的内容。我的直觉告诉我,使用*args和**kwargs会带你去你想去的地方,但如果没有更多信息,我无法确定。 -
公平。这些函数实际上并不是从 sim 内部调用的。 sim 所做的只是返回 ODE 系统的瞬时值,scipy
odeint函数使用这些值来确定我感兴趣的系统的演变。这反过来又从计算误差的函数中调用在模拟和一些数据之间,由emcee或optimize.minimize调用。最后两个的工作是最小化误差函数;我需要进行列表解包的原因是因为它们需要将要调整的参数传递到列表中。 -
*args不起作用,因为每个参数都作为单独的参数传递,我需要将它们全部作为单个列表的元素传递。
标签: python parameters scipy emcee