动机

作者 Yangtf

最近一直在求各种导数,于是就想写一个自动求导的算法。 其实python中的theano就有这个功能,但想了想,思路不难,于是就动手实现了一个。

本来想用c++实现了,但发现c++写各种问题,内存管理、操作符重载都不尽人意。花费了不少时间后,决定换语言。 Java是第一熟练语言,但不支持操作符重载,奈何? 于是转战python。

源代码路径

思路

##函数的表示

将函数表达式表示为一个表达式树。

那个这个表达式树如何构建呢? 要自己写语法分析么? 太麻烦,有种比较简单的办法,就是使用操作符重载来实现。

定义一个类E,重载它的 + - * / **(乘方)操作,在重载中,进行二叉树的构建。

节点类型

在这个表达式树中,主要应有三种节点类型。

其一,常数节点。如 2,3

其二,变量节点,如 a,b,x,y之类。

其三,操作节点。如 + , - ,* , / ,乘方等。

求导方法

有了表达式构成的二叉树,下面就是求导了。

对常数节点求导,结果为0 。

对变量节点求导,有两种情况。如

$$ f(a,b) = a^2 + 3b $$

这个函数对$a$ 求偏导,那么就将b节点看成是一个常数,求导结果为0。

对于保存了a的节点,求导结果为1。

求导的方法就是那些求导公式,举例:

$$ (x+y)' = x' + y' $$

上面的公式,对于一个根为‘+’的二叉树,分别对其左子树和 右子树进行求导,然后将求导得到的和相加。

那么如何求导左子树呢?,递归的调用这个求导方法就可以了。

对乘方节点的处理时比较难的。

先对左子树f求导,对右子树g求导。

如果f求导为0,说明是指数函数 ,如果g求导为0,说明是幂函数,分别套用公式。

至于$f(x)^g(x)$ 这种形式,求导公式有点复杂,还要去请教一些数学方面的高手。还没有做。

化简

求导不是最难的,最难的是化简。 比如对 1 / ( 1 + e ^ ( - ( w * x + b ) ) ) 按照上述算法求导,得到的结果是:

( 0 * ( 1 + e ^ ( - ( w * x + b ) ) ) - 1 * ( 0 + e ^ ( - ( w * x + b ) ) * 1 * ( 0 * ( w * x + b ) + - ( 1 * x + w * 0 + 0 ) ) ) ) / ( 1 + e ^ ( - ( w * x + b ) ) ) * ( 1 + e ^ ( - ( w * x + b ) ) )

这就需要化简。我实现了化简的几个思路:

(1) 0+x,x+0 x-0 这种化简为 x 。0x x0 0/x 化简为 0

在上图中, 左图c节点为0,则应让a直接指向d。删除c和b节点。 右图为1x的图,应让a直接指向d。

(2)x1 1x x/1 这种直接简化为x

(3) 两个常量进行运算,F+F, F-F, FF, F/F 都简化为单一节点。

(4) 较为复杂的节点合并。

在上图中,右子树有个3, 左子树有一个4,算法

如果右子树是一个常量节点,则在左子树中查找与p指向节点符号相同的节点。 经过三个星号,找到了4,然后3*4 ->12 ,随后删除原本p指向的节点,让p直接指向原本的左子树。

(5) $x*x => x^2 $

(6) $ 0-x => -1*x $

(7) x^1 => x

(8) log e - > 1

代码实现

本项目

运行测试

以 sigmoid函数为例,进行求导。

待求导的函数

1 / ( 1 + e ^ ( - ( w * x + b ) ) )

求导后,化简前

( 0 * ( 1 + e ^ ( - ( w * x + b ) ) ) - 1 * ( 0 + e ^ ( - ( w * x + b ) ) * 1 * ( 0 * ( w * x + b ) + - ( 1 * x + w * 0 + 0 ) ) ) ) / ( 1 + e ^ ( - ( w * x + b ) ) ) * ( 1 + e ^ ( - ( w * x + b ) ) )

化简后,中间还是有一个1在哪里, 问题在哪里太晚了,不查了。结果是对的。

e ^ ( - ( w * x + b ) ) * 1 * x / ( 1 + e ^ ( - ( w * x + b ) ) ) ^ 2

TODO

分数化简

python函数求导_python_exp相关推荐

  1. python函数求导_python怎么实现函数求导

    python实现函数求导的方法是:1.利用sympy库中的symbols方法传入x和y变量:2.利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果. python利用sympy库 ...

  2. python函数求导_python构建计算图1——简单实现自动求导

    机器学习和深度学习中比较重要的内容便是计算图,主流的框架如tensorflow,pytorch都是以计算图为主要框架.而计算图的核心便是自动求导. 所谓自动求导,就是在表达式或者网络结构确定之时,其( ...

  3. Python 函数求导

    from sympy import * x = symbols("x")  # 符号x,自变量 y = -pow(10,-11)*pow(x,6) + pow(10,-8)*pow ...

  4. python求导函数的值_python怎么实现函数求导

    python实现函数求导的方法是:1.利用sympy库中的symbols方法传入x和y变量:2.利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果. python利用sympy库 ...

  5. python numpy 多项式函数 求导求根

    python numpy 多项式函数 求导求根 """求出多项式的 导函数与根 """import numpy as np import m ...

  6. python 求导实现_python怎么实现函数求导

    python实现函数求导的方法是:1.利用sympy库中的symbols方法传入x和y变量:2.利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果. python利用sympy库 ...

  7. python求导函数公式_python怎么实现函数求导

    python实现函数求导的方法是:1.利用sympy库中的symbols方法传入x和y变量:2.利用sympy库中的diff函数传入需要求导的函数即可返回求导之后的结果. python利用sympy库 ...

  8. 课程作业1-数据预处理以及 python对函数求导

    谨记第一次作业用到的内容,应该是对的吧 哈哈哈 读取数据,获取基本信息. 1. 现已使用Pandas读取数据集challenge.csv • 请提取该数据集的字段名称,将结果存为cols • 请获取给 ...

  9. python利用sympy库对某个函数求导,numpy库使用该求导结果计算的程序

    ** python利用sympy库对某个函数求导,numpy库使用该求导结果计算的程序 ** 在python数据处理过程中,我们经常会遇见这样一种情况.需要对一个函数表达式求偏导,并将具体数值代入导数 ...

最新文章

  1. 一种消息和任务队列——beanstalkd
  2. Qt5标准文件对话框类
  3. 支付接入开发的陷阱有多深?
  4. awk 系列Part5:如何使用 awk 复合表达式
  5. 一步一步详解ID3和C4.5的C++实现
  6. ubuntu php 支持mysql_在ubuntu16.04上安装php7 mysql5.7 nginx1.10并支持http2
  7. 让Windwos Server 2008 R2 SP1的FTP真正能访问
  8. 在web3上搭建ecshop网上商城
  9. tab切换中的滚动条下拉分页带来的问题
  10. idea中鼠标左键选中代码是矩形
  11. CV领域的实验室及研究组
  12. 分享抖音上热门技巧!短视频涨粉+运营攻略!
  13. D. Berserk And Fireball(模拟)
  14. Gin:路由抽离与分组
  15. 基于WEMOS的智能WiFi避障小车
  16. 再见2020,你好2021
  17. 手写一个java爬虫,获取网页信息。
  18. Vue给每个v-for的元素设置不同的点击事件
  19. Win 11 添加并使用 DOH
  20. 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员最新解析

热门文章

  1. 朝鲜黑掉韩国政府版 Word
  2. Innodb独立的undo tablespace
  3. Tapestry 教程(七)在Tapestry中一起使用Hibernate
  4. 如何在vs2010中使用ConfigurationManager
  5. Deep Learning快速学习方法
  6. 串行设备造成鼠标乱跑的问题
  7. 【机器学习】因子分解机(Factorization Machine)原理与java实现
  8. linux命令安装中英文插件,linux – 如何使用命令行自动安装Eclipse插件?
  9. 运维安全加固规范_DBA如何巧用“三十六计”保障数据库安全?
  10. 中value大小_如何在Spring/SpringBoot 中做参数校验?你需要了解的都在这里!