最优化方法Python计算:函数向量和函数矩阵

news/2024/11/28 2:20:13/

函数 f ( x ) , x ∈ R n f(\boldsymbol{x}),\boldsymbol{x}\in\text{ℝ}^n f(x),xRn的梯度
∇ f ( x ) = ( ∂ f ∂ x 1 ∂ f ∂ x 2 ⋮ ∂ f ∂ x n ) \nabla f(\boldsymbol{x})=\begin{pmatrix}\frac{\partial f}{\partial x_1}\\\frac{\partial f}{\partial x_2}\\\vdots\\\frac{\partial f}{\partial x_n}\end{pmatrix} f(x)= x1fx2fxnf
和Hesse阵
∇ 2 f ( x ) = ( ∂ 2 f ∂ x 1 ∂ x 1 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 ∂ x 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n ∂ x n ) \nabla^2f(\boldsymbol{x})=\begin{pmatrix}\frac{\partial^2f}{\partial x_1\partial x_1}&\frac{\partial^2f}{\partial x_1\partial x_2}&\cdots&\frac{\partial^2f}{\partial x_1\partial x_n}\\\frac{\partial^2f}{\partial x_2\partial x_1}&\frac{\partial^2f}{\partial x_2\partial x_2}&\cdots&\frac{\partial^2f}{\partial x_2\partial x_n}\\\vdots&\vdots&\ddots&\vdots\\\frac{\partial^2f}{\partial x_n\partial x_1}&\frac{\partial^2f}{\partial x_n\partial x_2}&\cdots&\frac{\partial^2f}{\partial x_n\partial x_n}\end{pmatrix} 2f(x)= x1x12fx2x12fxnx12fx1x22fx2x22fxnx22fx1xn2fx2xn2fxnxn2f
中的元素都是 x \boldsymbol{x} x的函数。以函数为元素的向量称为函数向量。相仿地,元素为函数的矩阵称为函数矩阵。以函数的意义,梯度和Hesse阵仍然是 x \boldsymbol{x} x的函数,不过前者为 R n → R n \text{ℝ}^n\rightarrow\text{ℝ}^n RnRn的函数,而后者为 R n → R n × n \text{ℝ}^n\rightarrow\text{ℝ}^{n\times n} RnRn×n的函数。
例如,Rosenbrock函数 f ( x 1 , x 2 ) = 100 ( x 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 f(x_1,x_2)=100(x_2-x_1^2)^2+(1-x_1)^2 f(x1,x2)=100(x2x12)2+(1x1)2的梯度
∇ f ( x 1 , x 2 ) = ( − 400 x 1 ( x 2 − x 1 2 ) − 2 ( 1 − x 1 ) 200 ( x 2 − x 1 2 ) ) \nabla f(x_1,x_2)=\begin{pmatrix}-400x_1(x_2-x_1^2)-2(1-x_1)\\200(x_2-x_1^2)\end{pmatrix} f(x1,x2)=(400x1(x2x12)2(1x1)200(x2x12))
x = ( 0 0 ) \boldsymbol{x}=\begin{pmatrix}0\\0\end{pmatrix} x=(00)处的值为 ∇ f ( 0 , 0 ) = ( − 2 0 ) \nabla f(0,0)=\begin{pmatrix}-2\\0\end{pmatrix} f(0,0)=(20),在 x = ( 1 1 ) \boldsymbol{x}=\begin{pmatrix}1\\1\end{pmatrix} x=(11)处的值为 ∇ f ( 1 , 1 ) = ( 0 0 ) \nabla f(1,1)=\begin{pmatrix}0\\0\end{pmatrix} f(1,1)=(00)。Rosenbrock函数的Hesse阵
∇ 2 f ( x 1 , x 2 ) = ( − 400 ( x 2 − x 1 2 ) + 800 x 1 2 + 2 − 400 x 1 − 400 x 1 200 ) \nabla^2f(x_1,x_2)=\begin{pmatrix}-400(x_2-x_1^2)+800x_1^2+2&-400x_1\\-400x_1&200\end{pmatrix} 2f(x1,x2)=(400(x2x12)+800x12+2400x1400x1200)
其在 x = ( 0 0 ) \boldsymbol{x}=\begin{pmatrix}0\\0\end{pmatrix} x=(00)处的值为 ∇ 2 f ( 0 , 0 ) = ( 2 0 0 200 ) \nabla^2f(0,0)=\begin{pmatrix}2&0\\0&200\end{pmatrix} 2f(0,0)=(200200),而在 x = ( 1 1 ) \boldsymbol{x}=\begin{pmatrix}1\\1\end{pmatrix} x=(11)处的值为 ∇ 2 f ( 1 , 1 ) = ( 802 − 400 − 400 200 ) \nabla^2f(1,1)=\begin{pmatrix}802&-400\\-400&200\end{pmatrix} 2f(1,1)=(802400400200)
Python用于科学计算的工具包sicpy的optimization模块提供了计算Rosenbrock函数值、梯度值及Hesse阵值的函数rosen、rosen_der和rosen_hess。
例1 调用rosen_der和rosen_hess验算上述计算结果。
:下列代码完成本例计算。

import numpy as np                                  #导入numpy
from scipy.optimize import rosen_der,rosen_hess     #导入rosen_der,rosen_hess
x=np.array([0,0])                                   #设置向量x
print(rosen_der(x))                                 #计算梯度
print(rosen_hess(x))                                #计算Hesse阵
x=np.array([1,1])                                   #重设向量x
print(rosen_der(x))                                 #重算梯度
print(rosen_hess(x))                                #重算Hesse阵

程序的第1~2行分别导入numpy包和scipy包中optimization模块的rosen_der函数和rosen_hess函数。第3行创建numpy提供的array类数组对象x,并将其初始化为[0,0],第4、5行调用rosen_der和rosen_hess函数,分别计算Rosenbrock函数在[0,0]处的梯度和Hesse阵并输出。第6行将x重置为[1,1],第7、8行将打印算得的梯度和Hesse阵。运行程序,输出

[-2  0]
[[  2   0]
[  0 200]]
[0 0]
[[ 802 -400]
[-400  200]]

其中第1行输出的是 ∇ f ( 0 , 0 ) = ( − 2 0 ) \nabla f(0,0)=\begin{pmatrix}-2\\0\end{pmatrix} f(0,0)=(20),第2~3函数输出的是 ∇ 2 f ( 0 , 0 ) = ( 2 0 0 200 ) \nabla^2f(0,0)=\begin{pmatrix}2&0\\0&200\end{pmatrix} 2f(0,0)=(200200)。第4行输出 ∇ f ( 1 , 1 ) = ( 0 0 ) \nabla f(1,1)=\begin{pmatrix}0\\0\end{pmatrix} f(1,1)=(00),第5~6行输出 ∇ 2 f ( 1 , 1 ) = ( 802 − 400 − 400 200 ) \nabla^2f(1,1)=\begin{pmatrix}802&-400\\-400&200\end{pmatrix} 2f(1,1)=(802400400200)
Rosenbrock函数是Python作为基准问题唯一提供梯度和Hesse阵计算函数的对象。一般情况下,我们需要自行为函数 f ( x ) , x ∈ R n f(\boldsymbol{x}),\boldsymbol{x}\in\text{ℝ}^n f(x),xRn设置计算梯度和Hesse阵的函数。
Python中有一个lambda运算符,可以用来定义简单函数,其语法格式为
lambda x: expression
其中,x表示函数的自变量,分号后的expression表示计算函数返回值的表达式,一般含有自变量x。
例2lambda运算符,设计Rosenbrock函数的梯度函数和Hesse阵函数。
:下列代码完成本例计算。

import numpy as np                                                      #导入numpy
f1=lambda x:np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),              #设置梯度函数200*(x[1]-x[0]**2)])
f2=lambda x:np.array([[-400*(x[1]-x[0]**2)+800*x[0]**2+2,-400*x[0]],    #设置Hesse阵函数[-400*x[0],200]])
x=np.array([0,0])                                                       #设置向量x
print(f1(x))                                                            #计算梯度
print(f2(x))                                                            #计算Hesse阵
x=np.array([1,1])                                                       #重置向量x
print(f1(x))                                                            #重算梯度
print(f2(x))                                                            #重算Hesse阵

程序的第2~3行用lambda运算符定义Rosenbrock函数的梯度函数
∇ f ( x 1 , x 2 ) = ( − 400 x 1 ( x 2 − x 1 2 ) − 2 ( 1 − x 1 ) 200 ( x 2 − x 1 2 ) ) \nabla f(x_1,x_2)=\\\begin{pmatrix}-400x_1(x_2-x_1^2)-2(1-x_1)\\200(x_2-x_1^2)\end{pmatrix} f(x1,x2)=(400x1(x2x12)2(1x1)200(x2x12))
为f1。注意,Python数组的下标是从0开始编码的。第4~5行定义Hesse阵函数
∇ 2 f ( x 1 , x 2 ) = ( − 400 ( x 2 − x 1 2 ) + 800 x 1 2 + 2 − 400 x 1 − 400 x 1 200 ) \nabla^2f(x_1,x_2)=\begin{pmatrix}-400(x_2-x_1^2)+800x_1^2+2&-400x_1\\-400x_1&200\end{pmatrix} 2f(x1,x2)=(400(x2x12)+800x12+2400x1400x1200)
为f2。注意, Python使用二维数组(等长数组的数组)表示矩阵。第6~8行和9~11行分别计算 x = ( 0 0 ) \boldsymbol{x}=\begin{pmatrix}0\\0\end{pmatrix} x=(00) x = ( 1 1 ) \boldsymbol{x}=\begin{pmatrix}1\\1\end{pmatrix} x=(11)处Rosenbrock函数的梯度和Hesse阵并输出。程序运行结果为

[-2  0]
[[  2   0]
[  0 200]]
[0 0]
[[ 802 -400]
[-400  200]]

与例1的输出一致。


http://www.ppmy.cn/news/46283.html

相关文章

ThingsBoard开源物联网平台智慧农业实例快速部署教程(Ubuntu、CentOS适用)

ThingsBoard部署教程文档 文章目录 ThingsBoard部署教程文档1. JDK环境安装2. 安装thingsBoard2.1 ThingsBoard软件包安装2.2 PostgreSQL安装2.3 PostgreSQL初始化配置 3. 修改ThingsBord的配置4. 运行安装脚本测试5. 访问测试6. 导入一个仪表盘库6.1 导出仪表盘并导入自己的项…

【Linux】CentOS7.6 升级 gcc/g++

CentOS 7.6 升级 gcc/g的方法,不一定适用于其他linux系统 1.查看版本 g -v gcc -v当前查看版本,发现是4.8.5,这已经是2015年的旧版本了,对c11的支持不是很完善,为了方便学习和编写新版本的代码,升级一下还…

【TypeScript】TypeScript基础语法快速入门

快速入门 0、TypeScript简介 TypeScript是JavaScript的超集。它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。TS完全兼容JS,换言之,任何的J…

C++入门之auto关键字内联函数

文章目录 前言一、auto关键字1.auto简介2.auto的使用细则(1)auto与指针和引用结合起来使用(2)在同一行定义多个变量(3)auto不能推导的场景 3.基于范围的for循环(C11)(1)遍历&#xf…

Git——利用SSH密钥本地仓库上传远程GitHub库

文章目录 1、前言2、详细步骤2.1 创建密钥2.2 进入密钥文件并复制2.3 在GitHub上添加密钥2.4 回到本地仓库文件夹,连接GitHub并上传 3. 结语 1、前言 现在想要从本地设备将本地仓库上传到GitHub上需要用到SSH密钥,接下来讲解大致的步骤,本文默…

网络安全-kali配置ssh服务+敏感文件泄+dirsearch脚本

网络安全-kali配置ssh服务敏感文件泄dirsearch脚本 seccure shell 就是加密的telnet 远程用的 service ssh start 开启ssh服务metstat -tpan |gerp 22 监听这个端口是否开启 可以看到本地的22端口这个文件是/etc/ssh/sshd_config 输入 set number 找到第57行 把这个前面的#注…

VOC数据格式介绍

我们经常需要使用自己通过标注工具(如LabelImg、LabelMe等)生成的数据集或者一些开源数据集进行目标检测模型的训练,这些自定义数据集格式多样且不具有一致性,而目标检测的数据格式相比于其他任务又复杂很多,因此&…

ASIC-WORLD Verilog(6)运算符

写在前面 在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文&…