优化算法——拟牛顿法之DFP算法

优化算法——拟牛顿法之DFP算法

一、牛顿法       在博文“ ”中介绍了牛顿法的思路,牛顿法具有二阶收敛性,相比较最速下降法,收敛的速度更快。在牛顿法中使用到了函数的二阶导数的信息,对于函数

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,其中

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

表示向量。在牛顿法的求解过程中,首先是将函数

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

处展开,展开式为:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

其中,

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,表示的是目标函数在

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

的梯度,是一个向量。

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,表示的是目标函数在

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

处的Hesse矩阵。省略掉最后面的高阶无穷小项,即为:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

上式两边对

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

求导,即为:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

在基本牛顿法中,取得最值的点处的导数值为

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,即上式左侧为

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

。则:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

求出其中的

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

从上式中发现,在牛顿法中要求Hesse矩阵是可逆的。        当

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

时,上式为:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

此时,是否可以通过

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

模拟出Hesse矩阵的构造过程?此方法便称为拟牛顿法(QuasiNewton),上式称为拟牛顿方程。在拟牛顿法中,主要包括DFP拟牛顿法,BFGS拟牛顿法。

二、DFP拟牛顿法

1、DFP拟牛顿法简介           DFP拟牛顿法也称为DFP校正方法,DFP校正方法是第一个拟牛顿法,是有Davidon最早提出,后经Fletcher和Powell解释和改进,在命名时以三个人名字的首字母命名。    对于拟牛顿方程:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

化简可得:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,可以得到:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

在DFP校正方法中,假设:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

2、DFP校正方法的推导       令:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,其中

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

均为

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

的向量。

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

。        则对于拟牛顿方程

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

可以简化为:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

代入上式:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

代入上式:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法
www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

已知:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

为实数,

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

的向量。上式中,参数

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

解的可能性有很多,我们取特殊的情况,假设

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

。则:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

代入上式:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法
www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

,则:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法
www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

则最终的DFP校正公式为:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

3、DFP拟牛顿法的算法流程       设

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

对称正定,

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

由上述的DFP校正公式确定,那么

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

对称正定的充要条件是

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

。        在博文“ ”中介绍了非精确的线搜索准则:Armijo搜索准则,搜索准则的目的是为了帮助我们确定学习率,还有其他的一些准则,如Wolfe准则以及精确线搜索等。在利用Armijo搜索准则时并不是都满足上述的充要条件,此时可以对DFP校正公式做些许改变:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

DFP拟牛顿法的算法流程如下:

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

4、求解具体的优化问题       求解无约束优化问题

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

其中,

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

。     python程序实现:

  1. function.py
#coding:UTF-8
'''
Created on 2015年5月19日

@author: zhaozhiyong
'''

from numpy import *

#fun
def fun(x):
    return 100 * (x[0,0] ** 2 - x[1,0]) ** 2 + (x[0,0] - 1) ** 2

#gfun
def gfun(x):
    result = zeros((2, 1))
    result[0, 0] = 400 * x[0,0] * (x[0,0] ** 2 - x[1,0]) + 2 * (x[0,0] - 1)
    result[1, 0] = -200 * (x[0,0] ** 2 - x[1,0])
    return result
  1. dfp.py
#coding:UTF-8
'''
Created on 2015年5月19日

@author: zhaozhiyong
'''

from numpy import *
from function import *

def dfp(fun, gfun, x0):
    result = []
    maxk = 500
    rho = 0.55
    sigma = 0.4
    m = shape(x0)[0]
    Hk = eye(m)
    k = 0
    while (k < maxk):
        gk = mat(gfun(x0))#计算梯度
        dk = -mat(Hk)*gk
        m = 0
        mk = 0
        while (m < 20):
            newf = fun(x0 + rho ** m * dk)
            oldf = fun(x0)
            if (newf < oldf + sigma * (rho ** m) * (gk.T * dk)[0,0]):
                mk = m
                break
            m = m + 1
        
        #DFP校正
        x = x0 + rho ** mk * dk
        sk = x - x0
        yk = gfun(x) - gk
        if (sk.T * yk > 0):
            Hk = Hk - (Hk * yk * yk.T * Hk) / (yk.T * Hk * yk) + (sk * sk.T) / (sk.T * yk)
        
        k = k + 1
        x0 = x
        result.append(fun(x0))
    
    return result
  1. testDFP.py
#coding:UTF-8
'''
Created on 2015年5月19日

@author: zhaozhiyong
'''

from bfgs import *
from dfp import dfp

import matplotlib.pyplot as plt  

x0 = mat([[-1.2], [1]])
result = dfp(fun, gfun, x0)

n = len(result)
ax = plt.figure().add_subplot(111)
x = arange(0, n, 1)
y = result
ax.plot(x,y)

plt.show()

5、实验结果

www.zeeklog.com  - 优化算法——拟牛顿法之DFP算法

Read more

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

是一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器。 集成了 SearXNG AI 搜索、开发工具集合、 市面上最流行的 AI 工具门户,以及代码编写和桌面快捷工具等功能, 通过模块化的 Monorepo 架构,提供轻量级、可扩展且高效的桌面体验, 助力 AI 驱动的日常工作流程。

By Ne0inhk
超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk