基于父函数迭代函数定义

问题描述

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

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

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

reduced = lambda x,d: full_model(x,d)
reduced = lambda x,c: full_model(x,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。使用循环相当于做:

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