微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于父函数迭代函数定义

如何解决基于父函数迭代函数定义

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

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。