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



尽管这听起来像是一项简单的任务,但我还没有遇到通过文档执行此操作的方法。

运行任意例程(例如这些示例之一(后,我得到类似

>>> 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表达式?

您可以使用 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 ,它可以防止诸如加法之类的事情,但它不会阻止计算带有浮点参数的函数。

不得不稍微改变接受的答案以使其对我有用。

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)

相关内容

最新更新