如何将 gplearn 的输出导出为 sympy 表达式或其他可读格式?
How to export the output of gplearn as a sympy expression or some other readable format?
尽管这听起来像是一项简单的任务,但我还没有通过文档找到实现它的方法。
在 运行 一个任意例程(例如其中一个 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
表达式?
您可以使用 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)
这个 returns 一个 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 默认情况下所做的 "imaginary unit"。
我对 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)
尽管这听起来像是一项简单的任务,但我还没有通过文档找到实现它的方法。
在 运行 一个任意例程(例如其中一个 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
表达式?
您可以使用 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)
这个 returns 一个 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 默认情况下所做的 "imaginary unit"。
我对 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)