如何将gplearn的输出导出为sympy表达式或其他可读格式?

时间:2018-01-23 14:37:04

标签: python machine-learning sympy symbolic-math gplearn

尽管这可能听起来像一个简单的任务,但我没有遇到过通过文档来做到这一点的方法。

在运行任意例程(​​例如其中一个examples)后,我得到类似

的内容
>>> print(est_gp)
sqrt(div(add(1.000, sub(div(sqrt(log(0.978)), X0), mul(-0.993, X0))),add(-0.583, 0.592)))

我如何(或者我甚至可以)将其转换为可以在gplearn之外使用的表达式,例如sympy表达式?

2 个答案:

答案 0 :(得分:3)

您可以使用sympify将其转换为SymPy表达式。这需要提供一个字典,以便SymPy正确解释add,mul,sub,div之类的东西:

locals = {
    "add": Add,
    "mul": Mul,
    "sub": Lambda((x, y), x - y),
    "div": Lambda((x, y), x/y)
}

sympify('sqrt(div(add(1.000, sub(div(sqrt(log(0.978)), X0), mul(-0.993, X0))), add(-0.583, 0.592)))', locals=locals)

这将返回一个SymPy表达式,其打印为

sqrt(110.333333333333*X0 + 111.111111111111 + 16.5721799259414*I/X0)

符号X0可以作为Symbol("X0")访问。或者,这是一种更强大的方法,您可以通过创建它们并提前将它们添加到字典中来明确说出符号是什么。

X0 = symbols("X0")
locals = {
    "add": Add,
    "mul": Mul,
    "sub": Lambda((x, y), x - y),
    "div": Lambda((x, y), x/y),
    "X0": X0
}

例如,这需要将I解析为符号“I”而不是SymPy默认情况下的“虚构单位”。

我对sqrt(log(0.978))的评价感到不满意。虽然sympify有选项evaluate=False,它可以防止像添加这样的事情,但它不会阻止评估带有浮点参数的函数。

答案 1 :(得分:0)

为了让它对我有用,只是做了一些改动。

converter = {
    'sub': lambda x, y : x - y,
    'div': lambda x, y : x/y,
    'mul': lambda x, y : x*y,
    'add': lambda x, y : x + y,
    'neg': lambda x    : -x,
    'pow': lambda x, y : x**y
}

sympy.sympify('sqrt(div(add(1.000, sub(div(sqrt(log(0.978)), X0), mul(-0.993, X0))), add(-0.583, 0.592)))', locals=converter)