牛顿法,障碍法,内点法

article/2025/9/14 22:49:22

基于对数障碍函数法的内点法

  • 牛顿法(Newton Method)
  • 对数障碍函数方法
  • 一个简单的例子
    • python代码

牛顿法(Newton Method)

牛顿法与梯度下降法,最速下降法等优化算法类似,是基于梯度的方法。给定一个二次可微的凸目标函数 f ( x ) f(x) f(x),将其在点 x k x_k xk处泰勒展开到二阶:
f ( x ) = f ( x k ) + ▽ f ( x k ) ( x − x k ) + 1 2 ▽ 2 f ( x k ) ( x − x k ) 2 , (1) f(x) = f(x_k) + \triangledown f(x_k)(x - x_k) + \frac{1}{2} \triangledown^2 f(x_k)(x - x_k)^2, \tag{1} f(x)=f(xk)+f(xk)(xxk)+212f(xk)(xxk)2(1)
两边同时对 x x x进行求导得到 ▽ f ( x ) = ▽ f ( x k ) + ▽ 2 f ( x k ) ( x − x k ) \triangledown f(x) = \triangledown f(x_k) + \triangledown^2 f(x_k )(x - x_k) f(x)=f(xk)+2f(xk)(xxk)。实际上求 f ( x ) f(x) f(x)的最小值的过程,可以转化成求 △ f ( x ) = 0 \triangle f(x) = 0 f(x)=0的过程。因此令 ▽ f ( x ) = 0 \triangledown f(x) = 0 f(x)=0,我们就得到了基本牛顿法的更新规则:
x = x k − ▽ 2 f ( x k ) − 1 ▽ f ( x k ) . (2) x = x_k - \triangledown^2 f(x_k)^{-1} \triangledown f(x_k). \tag{2} x=xk2f(xk)1f(xk).(2)
其中, ▽ x k = − ▽ 2 f ( x k ) − 1 ▽ f ( x k ) \triangledown x_k = - \triangledown^2 f(x_k)^{-1} \triangledown f(x_k) xk=2f(xk)1f(xk)称为牛顿步。由于 ▽ 2 f ( x k ) \triangledown^2 f(x_k) 2f(xk)的正定性,我们可以得到:
▽ f ( x k ) ▽ x k = − ▽ f ( x k ) ▽ 2 f ( x k ) − 1 ▽ f ( x k ) < 0 (3) \triangledown f(x_k) \triangledown x_k = -\triangledown f(x_k) \triangledown^2 f(x_k)^{-1} \triangledown f(x_k) < 0 \tag{3} f(xk)xk=f(xk)2f(xk)1f(xk)<0(3)
因此, ▽ x k \triangledown x_k xk牛顿步是函数值下降的方向。但是经过实践发现,基本牛顿法的步长有时候可能会过大,它的初始点需要足够的“靠近“极小值点,否则可能会导致算法不收敛(我就遇到这种情况)。所以有人提出了全局牛顿法,基于Armijio搜索寻找一个合适的步长。全局牛顿法的算法如下(参考Stephen Boyd的convex optimzation一书):
回溯线性搜索
全局牛顿法

对数障碍函数方法

我们考虑一个一般形式的优化问题:
minimize f 0 ( x ) s . t . f i ( x ) ≤ 0 , i = 1 , 2 , . . . , m A x = b (4) \text{minimize} \quad f_0(x) \\ s.t. \quad f_i(x) \leq 0, i = 1, 2, ..., m\\ Ax = b \tag{4} minimizef0(x)s.t.fi(x)0,i=1,2,...,mAx=b(4)
障碍法的思想是通过向目标函数中添加一个障碍函数(或者惩罚函数)来去掉优化问题中的不等式约束。把原优化问题的形式转化成如下的形式:
minimize f 0 ( x ) + ∑ i = 1 m I _ ( f i ( x ) ) s . t . A x = b (5) \text{minimize} \quad f_0(x) + \sum_{i = 1}^{m}I_{\_}(f_i(x)) \\ s.t. \quad Ax = b \tag{5} minimizef0(x)+i=1mI_(fi(x))s.t.Ax=b(5)
其中 I _ ( u ) I_{\_}(u) I_(u)是这样一个函数:
I _ ( u ) { 0 u ≤ 0 , ∞ u > 0. (6) I_{\_}(u)\begin{cases} 0 & u \leq 0, \\ \infty & u > 0. \end{cases} \tag{6} I_(u){0u0,u>0.(6)
其实就是在不等式约束的边界竖起一堵”墙“。当满足约束时, I _ ( u ) I_{\_}(u) I_(u)值为0;当破坏约束时, I _ ( u ) I_{\_}(u) I_(u)值为无穷,对函数值进行惩罚。对数障碍方法利用如下的障碍函数:
I _ ( u ) = − 1 t l o g ( − u ) , u < 0 (7) I_{\_}(u) = - \frac{1}{t} log(-u), u < 0 \tag{7} I_(u)=t1log(u),u<0(7)
将其带入到上面的优化问题(5)可得到如下的优化问题:
minimize t f 0 ( x ) + ∑ i = 1 m − l o g ( − f i ( x ) ) s . t . A x = b (8) \text{minimize} \quad t f_0(x) + \sum_{i = 1}^{m} - log (- f_i(x))\\ s.t. \quad Ax = b \tag{8} minimizetf0(x)+i=1mlog(fi(x))s.t.Ax=b(8)
其中,目标函数函数是凸的,因为 − 1 t l o g ( − u ) - \frac{1}{t} log(-u) t1log(u)关于 u u u是凸的,两个凸函数相加仍然是凸的。因此,我们可以用牛顿法进行求解。我们定义 x ∗ ( t ) x^*(t) x(t)为问题(8)最优解, p ∗ p^* p为原问题(4)的最小值,通过central path(具体可看convex optimization 第11章)的分析,可以得到:
f ( x ∗ ( t ) ) − p ∗ ≤ m t , (9) f(x^*(t)) - p^* \leq \frac{m}{t}, \tag{9} f(x(t))ptm,(9)
从(9)中可看出当 t t t逐渐增大, x ∗ ( t ) x^*(t) x(t)最终可以收敛到最小值值点。 f ( x ∗ ( t ) ) − p ∗ f(x^*(t)) - p^* f(x(t))p称为对偶gap。对数障碍法的算法如下:对数障碍法
实际上,障碍法的外层是对参数 t t t的更新,内层利用牛顿迭代法求解最优值。当 u u u设置的比较大的时候,外层更新的次数比较少,但是内层牛顿法迭代的次数增加。反之则相反,因此需要寻找合适的 u u u,通常设置 u ∈ { 10 , 20 } u \in \{10, 20\} u{10,20}.

一个简单的例子

考虑一个简单的优化问题:n
minimize c T x s . t . x ⪰ 0. (10) \text{minimize} \quad c^Tx \\ s.t. \quad x \succeq 0. \tag{10} minimizecTxs.t.x0.(10)

python代码

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import math as math# 目标函数
def fun(x, t):result = 0for i in range(x.size):if (x[i] <= 0):return float("inf")result += t * x[i] - np.log2(x[i])return result# 基于对数障碍法的内点法
def logBarriar():# 初始值m = 2t = 4x = np.array([1.3, 1])  # 初始点epsilon = 0.001  # 障碍函数法阈值mu = 10x = newtonMethod(x, t)while m / t > epsilon:# 更新tt = mu * t# 全局牛顿迭代求解t*f(x)+Φ*(x)的最值x = newtonMethod(x, t)# 全局牛顿迭代法
def newtonMethod(x_0, t):x = x_0epsilon = 0.00001  # 牛顿法阈值g = np.array(np.array([t, t]) - 1 / (x * np.log(2)))H = np.array([[1 / (math.pow(x[0], 2) * np.log(2)), 0], [0, 1 / (math.pow(x[1], 2) * np.log(2))]])delta_x = - np.matmul(g, np.linalg.inv(H.T))lambda_2 = np.matmul(np.matmul(g, np.linalg.inv(H.T)), g.T)trace = [[], []]  # 迭代轨迹while lambda_2 / 2 > epsilon:# 添加到迭代轨迹trace[0].append(x[0])trace[1].append(x[1])# 回溯线性搜索确定步长alpha = 0.1beta = 0.5k = 1  # 步长while fun(x + k * delta_x, t) > fun(x, t) + alpha * k * lambda_2:k = beta * k# 更新xx = x + k * delta_x# 目标函数的一阶导g = np.array(np.array([t, t]) - 1 / (x * np.log(2)))# 目标函数的Hessian矩阵H = np.array([[1 / (math.pow(x[0], 2) * np.log(2)), 0], [0, 1 / (math.pow(x[0], 2) * np.log(2))]])# 下降方向delta_x = - np.matmul(g, np.linalg.inv(H.T))# 牛顿增量lambda_2 = np.matmul(np.matmul(g, np.linalg.inv(H.T)), g.T)# 定义坐标轴ax1 = plt.axes(projection='3d')# 绘制三维函数图像x_1 = np.arange(0.1, 1.5, 0.1)x_2 = np.arange(0.1, 1.5, 0.1)xx_1, xx_2 = np.meshgrid(x_1, x_2)z = t * (xx_1 + xx_2) - (np.log2(xx_1) + np.log2(xx_2))ax1.plot_surface(xx_1, xx_2, z, cmap='rainbow')plt.show()# 绘制等高线plt.contour(xx_1, xx_2, z, 5, color='black')plt.plot(trace[0], trace[1], marker='X', color='b')plt.show()return xif __name__ == '__main__':logBarriar()

初始值为 c = ( 1 1 ) c = \begin{pmatrix}1\\1\end{pmatrix} c=(11), t = 4 t = 4 t=4, x = ( 1.3 , 1 ) x = (1.3, 1) x=(1.3,1)。下图是第一次迭代时,(8)的目标函数的图像和等高线以及迭代路径:
目标函数图像
迭代轨迹


http://chatgpt.dhexx.cn/article/oqVXcV6S.shtml

相关文章

牛顿法python 实现

有用请点赞&#xff0c;没用请差评。 欢迎分享本文&#xff0c;转载请保留出处。 牛顿法也是求解无约束最优化问题的常用方法&#xff0c;有收敛速度快的优点。牛顿法是迭代算法&#xff0c;每一步需要求解目标函数的海赛矩阵的逆矩阵。同时还有拟牛顿法、阻尼牛顿法、修正牛顿…

牛顿法及牛顿法求解优化问题

牛顿法及牛顿法求解优化问题 牛顿法 1. 由来和基本思想 牛顿法也叫牛顿迭代法和牛顿-拉夫森法 1. 牛顿迭代法&#xff1a;因为牛顿法的是通过迭代来实现的&#xff0c;每次运算都让结果比之前好一点。哪怕只好一点点&#xff0c;在很多次迭代之后也可以得到一个很好的结果甚…

最优化-牛顿法(Newton)

转&#xff1a;https://blog.csdn.net/qq_36330643/article/details/78003952 平时经常看到牛顿法怎样怎样&#xff0c;一直不得要领&#xff0c;今天下午查了一下维基百科&#xff0c;写写我的认识&#xff0c;很多地方是直观理解&#xff0c;并没有严谨的证明。在我看来&…

高斯牛顿法详解

一、高斯牛顿法发展历程 1、从上倒下为高斯牛顿法的前世今生已经未来的演化&#xff1a; 最速下降法&#xff08;一阶梯度法&#xff09; 牛顿法&#xff08;二阶梯度法&#xff09; 高斯牛顿法 列文伯格法 马夸尔特法 二、问题的引出 1、考虑如下优化目标函数&#xff1a;…

牛顿法,高斯-牛顿法

牛顿法&#xff08;Newton’s method&#xff09; 假如已知函数 f ( x ) f(x) f(x)&#xff0c;想要求 f ( x ) 0 f(x)0 f(x)0 的解&#xff08;或者叫根&#xff09;。 牛顿法&#xff08;Newton’s method&#xff09;大致的思想是&#xff1a; &#xff08;1&#xff0…

优化算法——牛顿法(Newton Method)

一、牛顿法概述 除了前面说的梯度下降法&#xff0c;牛顿法也是机器学习中用的比较多的一种优化算法。牛顿法的基本思想是利用迭代点 处的一阶导数(梯度)和二阶导数(Hessen矩阵)对目标函数进行二次函数近似&#xff0c;然后把二次模型的极小点作为新的迭代点&#xff0c;并不断…

牛顿法(Newton‘s method)求函数极小值

牛顿法一般指牛顿迭代法&#xff0c;也叫做牛顿-拉夫逊&#xff08;拉弗森&#xff09;方法&#xff08;Newton-Raphson method),其最初的作用是用来求解函数的零点&#xff0c;但是也可以像梯度下降方法一样&#xff0c;以迭代的形式来求函数的极值。而事实上&#xff0c;牛顿…

牛顿法(Newton Method)的原理和实现步骤

牛顿法的法的目的 牛顿法不仅可以用来求解函数的极值问题&#xff0c;还可以用来求解方程的根&#xff0c;二者在本质上是一个问题&#xff0c;因为求解函数极值的思路是寻找导数为0的点&#xff0c;这就是求解方程。 牛顿法的法的原理 一元函数的情况 根据一元函数的泰勒展…

牛顿法

《牛顿法》   牛顿法&#xff08;Newton method&#xff09;和拟牛顿法&#xff08;quasi Newton method&#xff09;是求解无约束最优化问题的常用方法&#xff0c;有收敛速度快的优点。牛顿法是迭代算法&#xff0c;每一步都需求解目标函数的海塞矩阵&#xff08;Hessian …

使用Andriod Device Moniter时用正则表达式筛选指定日志

有时候我们想过滤出指定的一个或者几个日志&#xff0c;又或者屏蔽掉一些无意义的日志&#xff0c;那么可以创建一个筛选&#xff0c;在此页面的by Log Tag填写如下格式的表达式&#xff1a; 过滤出指定tag的日志信息&#xff1a;^(?:tag1|tag2|tag3) 忽略指定tag的日志信息…

使用Memberane Moniter监控HTTP SOAP requests

Memberane Moniter 使用方法见左侧Documentation 此工具可以监控到每一次发生在指定端口的http请求或者soap请求&#xff0c;如图所示。 但是个人认为仍然有几个问题&#xff1a; 1.不能真正的监控8080端口&#xff0c;我个人认为他的原理是类似于复制了一遍8080端口的内容&am…

linux( sudo bmon ) 流量监控工具----类似于 moniter interface

sudo bmon monitor bandwidth interface eth0 &#xff08;vyos 把 bmon 的linux 改为 了 moniter interface 了&#xff0c;底层还是调用的 bmon&#xff09; Linux:~$ sudo bmon -h bmon 3.5 Copyright (C) 2001-2013 by Thomas Graf <tgrafsuug.ch> Copyright (C) 2…

Android Device Moniter部分问题的解决办法:

一、Android Device Moniter中File explorer显示空白的问题不显示内容&#xff1a; 解决办法&#xff1a; 如上图所示 1.Tools->Android->Enable ADB Integration处于关闭状态。 2.重新打开Android Device Moniter。 3.若还处于空白状态&#xff0c;则极有可能是ja…

操作系统锁的实现方法有哪几种_深入理解多线程(四)——Moniter的实现原理...

本文是《深入理解多线程系列文章》的第四篇。点击查看原文&#xff0c;阅读该系列所有文章。 在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter…

操作系统锁的实现方法有哪几种_深入理解多线程(四)—— Moniter的实现原理

文章来源&#xff1a;深入理解多线程&#xff08;四&#xff09;—— Moniter的实现原理 原文作者&#xff1a;Hollis 来源平台&#xff1a;微信公众号 在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理 中介绍过关于Synchronize的实现原理&#xff0c;无…

【深入理解多线程】 Moniter的实现原理(四)

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

synchronized实现原理之---Moniter的实现原理

上一篇synchronized的实现原理提到了moniter&#xff0c;当时没有介绍它。 无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么是Monitor。 操作系统中的管程 如果你在大…

dubbokeeper-moniter部署指南

moniter在整个dubbo架构中的角色: 使用的1.0.1版本: ## 1.0.1版本变动内容 dubbokeeper在1.0.1版本对监控数据存储模块抽离出来&#xff0c;做为单独的应用部署&#xff0c;而不是和1.0.0版本和前端展示集成在一个应用里面在1.0.0版本中暂时提供了mysql以及1.0.0中已有的lucene…

Abaqus2022不能进行多核计算问题以及提交运算moniter不显示信息问题

近期换了新电脑&#xff0c;安装了abaqus2022&#xff0c;但出现了使用多核无法计算的问题&#xff0c;只能使用单核&#xff1b;另外使用单核计算时&#xff0c;moniter中不显示计算的信息&#xff0c;只能看到结果等。 问题如下&#xff1a; 在网上也找了好多的解决方式&…

深入理解多线程(四)— Moniter的实现原理

深入理解多线程&#xff08;四&#xff09;— Moniter的实现原理 在深入理解多线程&#xff08;一&#xff09;—Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、mon…