当前位置: 首页 > news >正文

辽阳企业网站建设网站sem

辽阳企业网站建设,网站sem,建设部网站注销一级建造师,衡水移动网站建设报价数学参考 有限差方法求导,Finite Difference Approximations of Derivatives,是数值计算中常用的求导方法。数学上也比较简单易用。本文主要针对的是向量值函数,也就是f(x):Rn→Rf(x):\mathbb{R^n}\rightarrow \mathbb{R}f(x):Rn→R当然&…

数学参考

有限差方法求导,Finite Difference Approximations of Derivatives,是数值计算中常用的求导方法。数学上也比较简单易用。本文主要针对的是向量值函数,也就是f(x):Rn→Rf(x):\mathbb{R^n}\rightarrow \mathbb{R}f(x):RnR当然,普通的标量值函数是向量值函数的一种特例。

本文采用的数学参考是:有限差方法
参考的主要是Central Difference Approximations小节中的Second-order derivatives based on gradient calls的那个公式。

代码

准备

本文的方法只需要numpy包,几乎可以说不需要任何包,而且不受到什么限制,只要满足输入格式就能求取,比所谓autogradnumdifftools好用的多。

梯度函数

为了求Hessian矩阵,本文采用的方法需要首先求取梯度。首先需要有一个函数func,示例的func如下:

def func(x, **args):x_0 = x[0]x_1 = x[1]return x_0**2 + x_1**2

该函数是一个R2→R\mathbb{R^2}\rightarrow \mathbb{R}R2R的函数。将该函数输入进下面的函数grad_func_generator中之后,就可以返回梯度函数,支持在任何一点求取梯度。这里输入x应该是一个列表,是各个维度的输入。例如x = [0,0].

def grad_func_generator(func, eps = 0.00001):def gradient_func(point):n_var = len(point)gradient = np.zeros(n_var, np.float32)# nth gradientfor i in range(n_var):# 初始化左点和右点,同时不改变原来的展开点left_point = point.copy()right_point = point.copy()left_point[i] = point[i] - epsright_point[i] = point[i] + epsgradient[i] = (func(right_point) - func(left_point))/(2*eps)return gradientreturn gradient_func

求取梯度:

grad_f = grad_func_generator(func) # 生成梯度函数
grad_f([1,1])

可以得到结果:

array([2., 2.], dtype=float32)

Hessian矩阵

利用已经实现的梯度函数,可以实现Hessian矩阵。

def hessian(func, point = [0, 0], eps = 0.00001):"""Hessian matrix of func at expendung point."""n_var = len(point)def grad_func_generator(func):def gradient_func(point):gradient = np.zeros(n_var, np.float32)# nth gradientfor i in range(n_var):# 初始化左点和右点,同时不改变原来的展开点left_point = point.copy()right_point = point.copy()left_point[i] = point[i] - epsright_point[i] = point[i] + epsgradient[i] = (func(right_point) - func(left_point))/(2*eps)return gradientreturn gradient_funcgrad_func = grad_func_generator(func)hessian_matrix = np.zeros((n_var, n_var), np.float32)for i in range(n_var):for j in range(n_var):# 第一项left_point_j = point.copy()right_point_j = point.copy()right_point_j[j] = point[j] + epsleft_point_j[j] = point[j] - epsdiff_i = (grad_func(right_point_j)[i] - grad_func(left_point_j)[i])/(4*eps)# 第二项left_point_i = point.copy()right_point_i = point.copy()right_point_i[i] = point[i] + epsleft_point_i[i] = point[i] - epsdiff_j = (grad_func(right_point_i)[j] - grad_func(left_point_i)[j])/(4*eps)hessian_matrix[i, j] = diff_i + diff_jreturn hessian_matrix

可以通过输入函数func和求取二阶导数的点x,就可以输出该点处的Hessian矩阵。

hessian(func, [0,0])

得到结果

array([[2., 0.],[0., 2.]], dtype=float32)

如果和numdifftools的结果对照,可以发现一样。但是numdifftools非常难用,总是报错。我们的程序只需要numpy包就能实现,非常方便好用。

http://www.15wanjia.com/news/170636.html

相关文章:

  • 哈尔滨免费建站模板gif网站素材
  • 怎么做自己的网站推广wordpress连续id
  • 桂林设计单位资质升级网站如何找做网站的公司
  • 北京网站建设 seo公司哪家好云南建设厅网站删除
  • 上海本地网站建设设计师工作室
  • 怎样建设一个好的网站莱州网站建设多少钱
  • dw网站怎么做背景图企业网站教程
  • 网站统计系统 怎么做舟山做网站
  • 英文网站建设方案接做效果图网站
  • 做纪念品网站做网站后台都要自己写吗
  • 沈阳工务建设集团网站苏宁易购网页布局设计
  • 安全生产门户网站建设方案互联网 创新创业大赛
  • 免费中文网站模板html俄文视频网站开发
  • 做网站推广的需要了解哪些知识青海网站建设优化
  • 三好街做网站的wordpress 子目录建站
  • 吴江区建设银行招聘网站wordpress手机显示不了图片
  • 市场营销网站网站推广的方案设计怎么写
  • 上海企业网站建设电话做外销网站服务器好吗
  • 免费包装设计网站电商网站制作方案
  • 德州有做网站的软件上市公司排名
  • 网站建设公司问答营销案例规模以上工业企业利润总额
  • 免费建站软件哪个好培训推广 seo
  • 用什么编程语言做网站好科技期刊网站建设
  • 深圳网站关键词推广怎么做网站的二维码
  • wordpress采集发布接口手机网站如何做优化
  • 公司网站首页设计模板机房建设网站
  • 做网站的怎么学三只松鼠网站怎样做
  • 棋牌网站制作价格怎么网站能找人做装修事
  • 有好的学网站建设的书吗企业宣传片制作软件app
  • 电商网站如何设计内容wordpress插件 知乎