最优化方法Python计算:BFGS算法

按秩1法(详见博文《最优化方法Python计算:秩1拟牛顿法》)计算的修正矩阵 Q k + 1 = Q k + E k \boldsymbol{Q}_{k+1}=\boldsymbol{Q}_k+\boldsymbol{E}_k Qk+1=Qk+Ek无法保证其正定性。这时, d k + 1 = − Q k + 1 g k + 1 \boldsymbol{d}_{k+1}=-\boldsymbol{Q}_{k+1}\boldsymbol{g}_{k+1} dk+1=Qk+1gk+1可能不是 f ( x ) f(\boldsymbol{x}) f(x) x k + 1 \boldsymbol{x}_{k+1} xk+1处的下降方向,致使算法失败。要摆脱秩1法的这一窘境,需另辟蹊径。很自然的想法是“秩2”修正:设 Q k \boldsymbol{Q}_k Qk对称正定,令修正矩阵
E k = Δ x k Δ x k ⊤ Δ x k ⊤ Δ g k − Q k Δ g k Δ g k ⊤ Q k Δ g k ⊤ Q k Δ g k \boldsymbol{E}_k=\frac{\Delta\boldsymbol{x}_k\Delta\boldsymbol{x}_k^\top}{\Delta\boldsymbol{x}_k^\top\Delta\boldsymbol{g}_k}-\frac{\boldsymbol{Q}_k\Delta\boldsymbol{g}_k\Delta\boldsymbol{g}_k^\top\boldsymbol{Q}_k}{\Delta\boldsymbol{g}_k^\top\boldsymbol{Q}_k\Delta\boldsymbol{g}_k} Ek=ΔxkΔgkΔxkΔxkΔgkQkΔgkQkΔgkΔgkQk
于是得到 Q k + 1 \boldsymbol{Q}_{k+1} Qk+1的秩2修正公式
Q k + 1 = Q k + E k = Q k + Δ x k Δ x k ⊤ Δ x k ⊤ Δ g k − Q k Δ g k Δ g k ⊤ Q k Δ g k ⊤ Q k Δ g k . ( 1 ) \boldsymbol{Q}_{k+1}=\boldsymbol{Q}_k+\boldsymbol{E}_k=\boldsymbol{Q}_k+\frac{\Delta\boldsymbol{x}_k\Delta\boldsymbol{x}_k^\top}{\Delta\boldsymbol{x}_k^\top\Delta\boldsymbol{g}_k}-\frac{\boldsymbol{Q}_k\Delta\boldsymbol{g}_k\Delta\boldsymbol{g}_k^\top\boldsymbol{Q}_k}{\Delta\boldsymbol{g}_k^\top\boldsymbol{Q}_k\Delta\boldsymbol{g}_k}.\quad\quad(1) Qk+1=Qk+Ek=Qk+ΔxkΔgkΔxkΔxkΔgkQkΔgkQkΔgkΔgkQk.(1)
利用式(1)作为正定阵 Q k + 1 \boldsymbol{Q}_{k+1} Qk+1修正公式的拟牛顿法是由Broyden,Fletcher,Goldfarb和Shanno在20世纪70年代各自独立提出来的,故常称为BFGS算法。可以证明:
定理1 (1)设 Q k \boldsymbol{Q}_k Qk对称正定,由式(1)确定的 Q k + 1 \boldsymbol{Q}_{k+1} Qk+1正定,当且仅当 Δ x k ⊤ Δ g k > 0 \Delta\boldsymbol{x}_k^\top\Delta\boldsymbol{g}_k>0 ΔxkΔgk>0
(2)设目标函数 f ( x ) f(\boldsymbol{x}) f(x) x ∈ R n \boldsymbol{x}\in\text{R}^n xRn一阶连续可微,且有极小值点 x 0 \boldsymbol{x}_0 x0。则BFGS算法每次迭代均有 Δ x k ⊤ Δ g k > 0 \Delta\boldsymbol{x}_k^\top\Delta\boldsymbol{g}_k>0 ΔxkΔgk>0
BFGS算法是一个改进了的拟牛顿算法,读者可作为练习用Python实现BFGS算法。Python的scipy.optimize为用户提供了BFGS方法,只需要在调用minimize时将’BFGS’传递给method参数即可用BFGS方法计算目标函数的最优解。
例1 用scipy.optimize提供的BFGS方法计算Rosenbrock函数的最优解,给定初始点 x 1 = ( 100 100 ) \boldsymbol{x}_1=\begin{pmatrix}100\\100\end{pmatrix} x1=(100100)
:下列代码完成本例计算。

import numpy as np                                      #导入numpy
from scipy.optimize import rosen, minimize              #导入rosen, minimize
x=np.array([100,100])                                   #设置初始点
res=minimize(rosen,x,method='BFGS')                     #计算最优解
print(res)

运行程序,输出

      fun: 1.8831204186846363e-11hess_inv: array([[0.49113161, 0.98272927],[0.98272927, 1.97132641]])jac: array([ 2.16488885e-06, -9.42470479e-07])message: 'Optimization terminated successfully.'nfev: 1488nit: 385njev: 496status: 0success: Truex: array([0.99999566, 0.99999131])

这意味着BFGS方法从初始点 x 1 = ( 100 100 ) \boldsymbol{x}_1=\begin{pmatrix}100\\100\end{pmatrix} x1=(100100)起,迭代385次算得Rosenbrock函数的最优解 x 0 \boldsymbol{x}_0 x0的近似值为 ( 0.99999566 0.99999131 ) \begin{pmatrix}0.99999566\\0.99999131\end{pmatrix} (0.999995660.99999131)。虽然运行效率未必优于秩1算法(见博文《最优化方法Python计算:秩1拟牛顿法》中例),但根据定理1,算法运行的可靠性得到了保证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB中filloutliers函数用法

目录 语法 说明 示例 在向量中对离群值进行插值 使用均值检测和最邻近值填充方法 使用移窗检测法 填充矩阵行中的离群值 指定离群值位置 返回离群值阈值 filloutliers函数功能是检测并替换数据中的离群值。 语法 B filloutliers(A,fillmethod) B filloutliers(A,f…

聚观早报 | iPhone 15系列正式发布;月饼专利申请超10000项

【聚观365】9月14日消息 iPhone 15系列正式发布 月饼专利申请超10000项 “五个女博士”自建研究院 2023中国民营企业研发十强公布 华为和小米达成全球专利交叉许可协议 iPhone 15系列正式发布 2023年苹果秋季新品发布会如期而至。发布会上,苹果发布了iPhone 1…

STM32 CAN使用记录:FDCAN基础通讯

文章目录 目的基础说明关键配置与代码轮询方式中断方式收发测试 示例链接总结 目的 CAN是非常常用的一种数据总线,被广泛用在各种车辆系统中。这篇文章将对STM32中FDCAN的使用做个示例。 CAN的一些基础介绍与使用可以参考下面文章: 《CAN基础概念》htt…

基于Xml方式Bean的配置-Bean的延时加载

SpringBean的配置详解 Bean的延时加载 当lazy-init设置为true时为延时加载,也就是当Spring容器创建的时候,不会立即创建Bean实例,等待用到时再创建Bean实例并储存到单例池中,后续使用该Bean时直接从单例池中获取即可,…

Prometheus、Chronos背景故事

希腊神话 Prometheus(普罗米修斯) Prometheus(普罗米修斯)是希腊神话中的一位重要的泰坦神,他被认为是知识之神和文明的启蒙者。以下是关于Prometheus的一些重要信息: 火种之赠: Prometheus 最…

手把手教你搭建农产品商城小程序:详细步骤解析

随着移动互联网的普及,越来越多的人开始关注如何在手机上进行购物,尤其是对于农产品这类日常生活所需品。本文将手把手教你搭建一个农产品商城小程序,让你轻松实现在手机上购买农产品的愿望。 一、登录乔拓云网后台 首先,我们需要…

83 # 静态服务中间件 koa-static 的使用以及实现

静态服务中间件:koa-static 中间件可以决定是否向下执行,如果自己可以处理,那么直接处理完毕结束,如果自己处理不了,next 方法会继续向下执行 新建 public 文件夹,里面添加 index.html、style.css 文件 …

使用IDEA开发Servlet

一、新建工程 二、填写新工程的基本信息 javaee8的项目可以运行在tomcat9 三、配置tomcat 1、编辑server信息 “On frame deactivation”的意思是idea窗口发生切换时。 2、编辑部署信息 war exploded方式,这种方式是以文件夹方式部署的,支持热加载。 …

400电话客服中心电话:为您提供全方位的客户服务

在现代商业环境中,提供优质的客户服务是企业成功的关键之一。为了满足客户的需求和解决问题,许多企业选择设立400电话客服中心。400电话是一种特殊的电话号码,可以通过固定电话和移动电话拨打,客户可以通过这个号码与企业进行沟通…

2023年最热门的编程语言:前进的趋势和机会

2023年最热门的编程语言:前进的趋势和机会 2023年最热门的编程语言:前进的趋势和机会摘要引言1. 编程语言的热门趋势1.1 新兴编程语言的崛起1.2 编程语言的可持续性发展1.3 跨平台编程语言的兴起1.4 人工智能和机器学习编程语言的需求 2. 编程语言职业机…

HDMI协议Ver2.0a(学习笔记)

1 简介 本规范由HDMI论坛制定 2.目的和范围 本文件构成了高清多媒体接口2.0版规范(HDMI规范2.0版)。本规范通过引用纳入了HDMI规范1.4b版,并定义了附加和改进的功能。对Source、Sink、中继器和电缆的合规性所需的机械、电气、行为和协议要…

QT:使用普通按钮、网格布局管理器、标签、行编辑器、水平布局管理器、垂直布局管理器做一个小项目

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //普通按钮 #include <QGridLayout> //网格布局管理器 #include <QLabel> //标签 #include <QLineEdit> //行编辑器 #include <QHBoxLayo…

Android 系统中适配OAID获取

一、OAID概念 OAID&#xff08;Open Anonymous Identification&#xff09;是一种匿名身份识别标识符&#xff0c; 用于在移动设备上进行广告追踪和个性化广告投放。它是由中国移动通信集 团、中国电信集团和中国联通集团共同推出的一项行业标准 OAID值为一个64位的数字 二、…

蓝桥杯2023年第十四届省赛真题-买瓜--Java题解

目录 蓝桥杯2023年第十四届省赛真题-买瓜 题目描述 输入格式 输出格式 样例输入 样例输出 提示 【思路解析】 【代码实现】 蓝桥杯2023年第十四届省赛真题-买瓜 时间限制: 3s 内存限制: 320MB 提交: 796 解决: 69 题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个…

Linux中安装MySQL_图解_2023新

1.卸载 为了避免不必要的错误发生,先将原有的文件包进行查询并卸载 // 查询 rpm -qa | grep mysql rpm -qa | grep mari// 卸载 rpm -e 文件名 --nodeps2.将安装包上传到指定文件夹中 这里采用的是Xftp 3.将安装包进行解压 tar -zxvf 文件名 -C 解压路径4.获取解压的全路…

生成代理:人类行为的交互模拟(Generative Agents: Interactive Simulacra of Human Behavior)

Generative Agents: Interactive Simulacra of Human Behavior 简介 论文是斯坦福大学和deepmind团队联合发表&#xff0c;主要介绍了一种利用LLM模型指导生成Agents代理的方法&#xff0c;让代理具有记忆、反思和规划的能力。 结合LLM模型创造了一个系统架构&#xff0c;架构…

Qt扩展-KDDockWidgets 简介及配置

Qt扩展-KDDockWidgets 简介及配置] 一、概述二、编译 KDDockWidgets 库1. Cmake Gui 中选择源文件和编译后的路径2. 点击Config&#xff0c;配置好编译器3. 点击Generate4. 在存放编译的文件夹输入如下命令开始编译 三、qmake 配置 一、概述 kdockwidgets是一个由KDAB组织编写…

GPIO子系统编写LED灯的驱动、linux内核定时器

一、GPIO子系统 1.概念&#xff1a; 一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动&#xff0c;我们当前只需要调用对应的厂商驱动即可完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多&#xff0c;这里linux内核对厂商驱动做了一些封装&#x…

无涯教程-JavaScript - MUNIT函数

描述 MUNIT函数返回指定尺寸的单位矩阵。 语法 MUNIT (dimension)争论 Argument描述Required/OptionalDimension Dimension是一个整数,指定要返回的单位矩阵的尺寸。 尺寸必须大于零。 Required Notes MUNIT返回一个数组。因此,应将其作为数组公式输入 MUNIT (N)$\begin{m…

在docker中安装MQTT教程

网上的好多关于在docker中安装MQTT教程都是错误的不完整的。这篇博客是完整的&#xff0c;实践过的&#xff0c;踩过了很多的坑得来的&#xff0c;欢迎大家享用&#xff01; 1、首先在docker中拉取镜像 docker pull eclipse-mosquitto2、创建配置文件目录 mkdir -p /docker/…