python中几种自动微分库

简单介绍下python的几个自动求导工具,tangent、autograd、sympy;
  在各种机器学习、深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法、数值微分法、符号微分法、自动微分法,这里分别简单走马观花(hello world式)的介绍下下面几种微分框架;

sympy 强大的科学计算库,使用的是符号微分,通过生成符号表达式进行求导;求得的导数不一定为最简的,当函数较为复杂时所生成的表达式树异常复杂;

autograd自动微分先将符号微分用于基本的算子,带入数值并保存中间结果,后应用于整个函数;自动微分本质上就是图计算,容易做很多优化所以广泛应用于各种机器学习深度学习框架中;

tangent源到源(source-to-source)的自动微分框架,在计算函数f微分时他通过生成新函数f_grad来计算该函数的微分,与目前所存在的所有自动微分框架都有所不同;由于它是通过生成全新的函数来计算微分所以具有非常搞的可读性、可调式性这也是官方所说的与当前自动微分框架的重大不同;

sympy 求导

 def grad():
     # 定义表达式的变量名称
     x, y = symbols('x y')
     # 定义表达式
     z = x**2 +y**2
     # 计算z关于y对应的偏导数
     return diff(z, y)

 func = grad()

输出结果表达式z的导函数z‘=2*y

 print(func) 

把y 等于6 带入计算 结果 为12

 print(func.evalf(subs ={'y':3}))

Autograd求偏导

 import autograd.numpy as np
 from autograd import grad

 #表达式 f(x,y)=x^2+3xy+y^2
 #df/dx = 2x+3y
 #df/dy = 3x+2y
 #x=1,y=2
 #df/dx=8
 #df/dy=7
 def fun(x, y):
   z=x**2+3*x*y+y**2
   return z

 fun_grad = grad(fun)
 fun_grad(2.,1.)

输出:7.0

tangent求导

 import tangent
 def fun(x, y):
   z=x**2+3*x*y+y**2
   return z

默认为求z关于x的偏导数

 dy_dx = tangent.grad(fun)

输出偏导数值为 8 ,z’ = 2 * x,此处x传任何值都是一样的

 df(4, y=1)

可通过使用wrt参数指定求关于某个参数的偏导数,下面为求z关于y的偏导数

 df = tangent.grad(funs, wrt=([1]))

输出值为10 ,z’ = 2 *y,此处x传任何值都是一样的

 df(x=0, y=5)

上面说了那么多也没体现出tangent的核心:源到源(source-to-source)

在生成导函数的时候加入verbose=1参数,即可看到tangent为我们生成的用于计算导数的函数,默认情况下该值为0所以我们没感觉到tangent的求导与别的自动微分框架有什么区别;

 def df(x):
     z = x**2
     return z

 df = tangent.grad(df, verbose=1)
 df(x=2)

在执行完上述代码后,我们看到了tangent为我们所生成用于求导数的函数:

  def ddfdx(x, bz=1.0):
    z = x ** 2
    assert tangent.shapes_match(z, bz), 'Shape mismatch between return value (%s) and seed derivative (%s)' % (numpy.shape(z), numpy.shape(bz))
 # Grad of: z = x ** 2
  _bx = 2 * x * bz
  bx = _bx
  return bx

  ddfdx函数就是所生成的函数,从中我们也可以看到表达式z的导函数z’=2 * x,tangent就是通过执行该函数用于求得导数的;

  sympy 中的自动微分只是它强大的功能之一,autograd 从名字也可知它就是为了自动微分而生的,tangent初出茅庐2017年底Google才发布的自动微分方法也比较新颖,从17年发v0.1.8版本后也没见发版,源码更新也不够活跃;sympy、autograd比较成熟,tangent还有待观察;

原文地址:https://www.cnblogs.com/softlin/p/11427390.html

时间: 2024-08-30 03:33:54

python中几种自动微分库的相关文章

Python中三种基本结构的语句

选择语句 if 条件判断 : # 条件可以加括号也可以不加括号 -- else: -- Python中没有switch语句这是可以使用if exp:.... elif exp:来代替 1 if 判断条件1: 2 执行语句1-- 3 elif 判断条件2: 4 执行语句2-- 5 elif 判断条件3: 6 执行语句3-- 7 else: 8 执行语句4-- Python 循环语句 while 循环 在给定的判断条件为 true 时执行循环体,否则退出循环体. for 循环 重复执行语句 嵌套循环

VBA中四种自动运行的宏以及模块的含义

在Excel的“标准模块”中可以创建4种自动运行的宏,它们分别是Auto_Open(打开工作 簿时自动运行), Auto_Close, Auto_Activate,  Auto_Deactivate.这些自动运行的宏是为了与Excel5和95兼容而保留下来的.现在可以使用工作簿的Open,Close,Activate,Deactivate 事件来代替它们. 那么,什么是“标准模块”呢?其实就是我们在VBE中插入的那个模块,微软称它为“标准模块”.而其余的三类:Microsoft Excel对象,

Python中四种运行其他程序的方式

在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数. [方式一]使用os.system()函数运行其他程序 os模块中的system()函数可以方便地运行其他程序或者脚本,模式如下: os.system(command) command: 要

Python中6种内建序列之通用操作

数据结构式通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序号--即元素的位置,也称为索引.第一个元素索引是0,第二个则是1,一次类推. Python包含6中内建的序列,即列表.元组.字符串.Unicode字符串.buffer对象和xrange对象. 通用序列操作:索引.分片.序列相加.乘法.成员资格.长度.最小值和最大值 1. 索引 序列

python中一种完全可能情况带入计算的处理方式

#!/usr/bin/env python#-*-encoding:utf-8 -*- ''' 例1:lst = [1, 34, 38, 33, 40, 10, 2, 45, 24, 29]#找出列表中的几个元素(不定,或许是一个,或许是所有),他们的平方和为 2386#return 倒序的元素列表  只找出一种情况即可'''lst = [1, 34, 38, 33, 40, 10, 2, 45, 24, 29] def check(group):#2386    if sum([pow(x,2

python中几种数据类型常用的方法

''' python几种数据类型常用方法: 列表 增加:append,insert,extend 删除:remove,pop,clear 修改: 查询:index,count 元组 查询:index,count *:解包操作 集合 增加:add 删除:pop,clear,remove 字典 增加:字典['键'] = 值 删除:pop,popitem,clear 修改:update(dict) 查询:get,keys,items,values,setdefault:有对应的键则返回对应的值,没有则

设置python中TAB键自动补全方法

一.创建自动补全脚本如下: vi /tmp/python/tab.py #!/usr/bin/python # python tab file import sys import readline import rlcompleter import atexit import os # tab completion readline.parse_and_bind('tab: complete') # history file histfile = os.path.join(os.environ[

Python中两种处理错误方法的比较

我所说的处理错误的方法,其实是try:,except和raise这两种. 首先抛出一个实例, dictt={'a':1,'b':2,'c':3} try: if dictt['d']>1: #字典中没有'd' print("right!") except KeyError: print("there is no 'd'") 该程序的运行结果: there is no 'd' 而改为raise时,执行结果却是: 显然,由于'f'是不存在的,所以if无法执行,导致

Python 中的Tab自动不起 和 一个还看的格式prettytab

Tab vim/usr/lib64/python2.6/site-packages/tab.py (sys.path查看Python路径,把自定义模块放此) import sys import readline import rlcompleter import atexit import os   readline.parse_and_bind('tab: complete') histfile = os.path.join(os.environ['HOME'],'.pythonhistory