尽管这听起来像是一项简单的任务,但我还没有遇到通过文档执行此操作的方法。
运行任意例程(例如这些示例之一(后,我得到类似
>>> 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)