首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将gplearn的输出导出为交感表达式或其他可读格式?

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

Stack Overflow用户
提问于 2018-01-23 14:37:03
回答 2查看 1.2K关注 0票数 7

虽然这听起来可能是一项简单的任务,但我还没有遇到通过文档完成这一任务的方法。

在运行任意例程(例如其中一个示例 )之后,我得到以下内容

代码语言:javascript
复制
>>> 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表达式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-24 03:20:39

您可以使用SymPy将其转换为sympify表达式。这需要提供一个字典,以便SymPy正确地解释诸如add、mul、sub、div这样的内容:

代码语言:javascript
复制
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表达式,该表达式将打印为

代码语言:javascript
复制
sqrt(110.333333333333*X0 + 111.111111111111 + 16.5721799259414*I/X0)

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

代码语言:javascript
复制
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,它可以防止诸如加法之类的事情,但它并不阻止计算带有浮点参数的函数。

票数 6
EN

Stack Overflow用户

发布于 2018-10-25 19:31:25

我不得不稍微修改一下接受的答案,才能让它对我有用。

代码语言:javascript
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48404263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档