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