PySR自定义运算符中Sympy与Numpy函数混用问题解析

PySR自定义运算符中Sympy与Numpy函数混用问题解析

PySR High-Performance Symbolic Regression in Python and Julia PySR 项目地址: https://gitcode.com/gh_mirrors/py/PySR

问题背景

在使用PySR符号回归库进行模型训练时,用户遇到了一个关于自定义运算符的转换错误。具体表现为:模型能够正常训练并找到表达式,但在最后将Julia表达式转换为Sympy表达式时出现"loop of ufunc does not support argument 0 of type Mul which has no callable exp method"错误。

问题分析

该问题的核心在于Sympy表达式和Numpy函数的混用。PySR在转换过程中需要将Julia表达式转换为Sympy表达式树,而用户定义的自定义运算符"logistic"使用了Numpy的exp函数实现:

extra_sympy_mappings={"logistic": lambda x: 1.0 / (1.0 + np.exp(-x))}

这里存在两个关键问题:

  1. 类型系统不匹配:Sympy表达式树中的节点是符号对象(如Mul、Add等),而Numpy的数学函数(如np.exp)只能处理数值型输入,无法直接处理符号表达式。

  2. 函数作用域混淆:在表达式转换阶段,PySR需要构建符号化的表达式树,因此所有运算符的实现都应当使用Sympy的数学函数,而非Numpy的实现。

解决方案

正确的做法是使用Sympy提供的数学函数实现自定义运算符:

extra_sympy_mappings={"logistic": lambda x: 1.0 / (1.0 + sp.exp(-x))}

同时需要注意:

  1. 确保导入的是Sympy库(import sympy as sp),而非Scipy
  2. 所有在extra_sympy_mappings中定义的函数都应使用Sympy函数实现

深入理解

PySR的工作流程分为几个关键阶段:

  1. 符号搜索阶段:在Julia端进行,使用定义的运算符组合生成候选表达式
  2. 表达式转换阶段:将找到的最佳表达式转换为Python端的Sympy表达式
  3. 评估阶段:将Sympy表达式编译为可执行的Numpy函数

错误发生在第二阶段,因为此时需要构建符号表达式树,而Numpy函数无法处理符号对象。Sympy的数学函数(如sp.exp)是专门设计来处理符号表达式的,它们能正确地在表达式树中创建对应的函数节点。

最佳实践

  1. 在定义自定义运算符时,始终使用Sympy函数实现符号映射
  2. 仔细检查导入的库,避免意外使用Scipy或Numpy的数学函数
  3. 对于复杂的自定义运算符,可以先在Sympy中测试其符号计算能力
  4. 注意PySR版本更新,确保与依赖库的兼容性

总结

PySR作为符号回归工具,其表达式转换过程依赖于Sympy的符号计算能力。理解Sympy和Numpy在不同阶段的作用,是避免此类问题的关键。通过正确使用Sympy函数实现自定义运算符,可以确保PySR从训练到表达式转换的完整流程顺利执行。

PySR High-Performance Symbolic Regression in Python and Julia PySR 项目地址: https://gitcode.com/gh_mirrors/py/PySR

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓谊翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值