繁体   English   中英

返回具有动态变量名称的 function 以用于例如 lmfit

[英]Returning a function with dynamic variable names for use in e.g. lmfit

如何最好地返回带有动态变量名的 function? 通常应该避免它。 但由于外部 package 限制,这可能并不总是可行的。 例如,LMFit使用显式变量名称来处理 model 的参数。

如果 function 是

def (x, y):
    return y*x

然后需要通过其显式名称y来处理参数。

对于复杂的通用拟合模型,可能需要动态生成具有不同参数的 model,例如:

def make_model(x, myDict):
    
    ...
    def myModel(x, V1, V2):
        ...
        ...
        return result

    return myModel

在此示例中,我想将变量V1V2的名称更改为例如myDict的键。 这可能吗? 是否应该这样做,如果不这样做,我该如何创建一个具有可交换变量名的 function 以用于此类包? 我不想让它们被称为V1V2 ,因为稍后对它们进行寻址时(并且当具有 > 5 个参数时)跟踪用户的名称可能会很笨拙。

这可能吗?

最简洁的答案是不”。 lmfit.Model class 检查 model ZC1C425268E68385D141AB5074Z 参数名称17。 这是一个对用户有利的重要特性:参数应该被命名,而不是按语法上重要但语义上无意义的顺序排列。

您可以使用scipy.optimize.curve_fit类的东西。 为此,变量从具有属性的参数对象减少为浮点值,这些值必须保持一致但最终无意义的顺序。 还有其他原因可以避免curve_fit ,但是“拟合参数”的这种糟糕的抽象真的很不幸——就像作者忘记了他们正在使用 Python 并认为他们正在编写 Fortran77。

或者您可以使用lmfit.minimize并编写自己的目标 function (对于曲线拟合,只需返回“(数据模式)/不确定性”)。 使用该接口,您可以传递一个lmfit.Parameters object - 本质上是一个参数对象的(有序)字典,然后您将其解压缩到您的目标 function 中。

是否应该这样做,如果不这样做,

我会说“可能不是”,并且您不应该命名参数V1V2等,除非这对您和处理结果的人有意义。 如果你告诉我V1是 100.2, V2是 0.75,我会说“哦,好吧……”。 OTOH,如果你告诉我Volume1是 100.2 而Velocity2是 0.75,现在我开始明白了。 名字很重要。

我如何创建一个具有可交换变量名的 function 以在此类包中使用?

使用命名参数构建函数,然后跟踪它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM