python - 生成 lambda 函数组合的组合

标签 python design-patterns lambda functional-programming

为了让我的 Python3 代码更优雅,我面临着一个具有挑战性的问题。

假设我有一个具有可变数量的不同输入的数字函数,例如如下所示:

def fun1(a,b):
    return a+b

def fun2(c,d,e):
    return c*d + e

def fun3(x):
    return x*x

这些函数需要聚集在一个函数中,该函数需要用作数值求解器的优化函数。

但是我需要使用这些函数创建各种运算的不同组合,例如将前两个函数的输出相乘并与第三个相加。

手动解决方案是创建特定的 lambda 函数:

fun = lambda x : fun1(x[0],x[1])*fun2(x[2],x[3],x[4]) + fun3(x[4])

但是我拥有的函数数量很多,我需要生成它们所有可能的组合。 我希望能够系统地组合这些函数,并始终了解从高级函数 fun 的参数到每个函数的低级参数的映射。 在这种情况下,我手动指定 x[0] 对应于 fun1 的参数 ax[1] 对应于 fun1 等的参数 b

有什么想法吗?

最佳答案

听起来您正在尝试做所谓的 symbolic regression .这个问题通常通过遗传算法的一些变体来解决,这些算法对基因中的功能关系进行编码,然后根据包括预测误差和惩罚更复杂关系的项的适应度函数进行优化。

这里有两个库可以为您解决这个问题:

以下类提供了一种基本的方法来组合函数并跟踪每个函数所需的参数数量,这似乎是您遇到的主要问题:

class Wrapper:
    def __init__(self, f):
        self.f = f
        self.n = f.__code__.co_argcount

    def __call__(self, x):
        return self.f(*x)

    def __add__(self, other):
        return Add(self, other)

    def __mul__(self, other):
        return Mul(self, other)

class Operator:
    def __init__(self, left, right):
        self.left = left
        self.right = right
        self.n = left.n + right.n

class Mul(Operator):
    def __call__(self, x):
        return self.left(x[:self.left.n]) * self.right(x[self.left.n:])

class Add(Operator):
    def __call__(self, x):
        return self.left(x[:self.left.n]) + self.right(x[self.left.n:])

要使用它们,您首先要为每个函数创建包装器:

w1 = Wrapper(fun1)
w2 = Wrapper(fun2)
w3 = Wrapper(fun3)

然后您可以添加和乘以包装器以获得一个新的类似函数的对象:

(w1 + w2*w3)([1, 2, 3, 4, 5, 6])

关于python - 生成 lambda 函数组合的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49047684/

相关文章:

c++ - 从 C++ 修改 python 列表

java - 在包含 lambda 表达式的字段上使用 ConstraintValidator 问题

python - 如何在 Travis 构建成功时运行单个部署?

python - 如何在 Tensorflow 中创建旋转矩阵

java - 工厂类应该是单例还是静态方法?

java - 覆盖时使用组合而不是继承

java - 避免使用构造项目添加到列表中的临时变量

Python - 在 List.Sort 中使用 Lambda

python - Python PIL 有抗锯齿方法吗?

design-patterns - 是否有将 "options"添加到类的模式?