迭代函数定义,基于父函数



我正在尝试编写一些代码来执行称为模型缩减的统计测试。基本上我想知道的是,我的函数中的每个变量是否做出了有意义的贡献(即显著解释方差)。例如,我原来的fit-function是这样的:

full_model(x, a, b, c, d):
return a + b*x + c*x**3 + sin(d*x)

我想比较这个模型的简化形式。我需要检查的是:

reduced = lambda x, b, c, d: full_model(x, 0, b, c, d)
reduced = lambda x, a, c, d: full_model(x, a, 0, c, d)
reduced = lambda x, a, b, d: full_model(x, a, b, 0, d)
reduced = lambda x, a, b, c: full_model(x, a, b, c, 0)

对于每种情况,我运行某种类型的测试,我不详细说明:

compare_models(full_model, reduced, x, y)

实际上,我的拟合函数有更多的参数,我想测试进一步简化的函数。如果我必须显式地定义所有可能的模型,代码将会非常混乱。在for循环中有什么方法来定义简化函数吗?是否有任何现有的python模块可以实现我想要做的事情?

我将以以下方式利用functools.partial,考虑以下简化示例:

import functools
def sum3(x, y, z):
return x+y+z
args = ["x", "y", "z"]
red_dict = {}
for arg in args:
red_dict[arg] = functools.partial(sum3, **{arg: 0})
print(red_dict["x"](y=10,z=10))
print(red_dict["y"](x=10,z=10))
print(red_dict["z"](x=10,y=10))

输出:

20
20
20

解释:args是你想要零的参数名称列表,在for-循环中,我使用参数解包(**)将选定的参数值固定为零,然后我将结果存储在red_dict中。Use loop相当于:

red_dict["x"] = functools.partial(sum3, x=0)
red_dict["y"] = functools.partial(sum3, y=0)
red_dict["z"] = functools.partial(sum3, z=0)

最新更新