接着上篇写的牛顿法,我们继续来研究牛顿法的改进方法——拟牛顿法。

拟牛顿法其实也是很简单了。为什么要研究出这种方法呢,就是因为常规的牛顿法每次迭代更新x值时都要计算Hessian矩阵。这是个二阶导矩阵,当x的维度增大时,它的计算量也是成指数倍增加的。比如:  ,那么H矩阵的维度就是n*n。

所以,我们就想拿个一阶矩阵来近似于Hessian矩阵。过程如下图:

其实思想都很简单。DFP方法是用一个G正定矩阵来近似于Hessian的逆矩阵,而BFGS方法是用一个B正定矩阵来近似于Hessian矩阵。两个矩阵的更新表达式如下所示:

公式看上去都大同小异的,虽然式子有很多,但求起来都挺简单的。另外,BFGS方法是当前最流行的拟牛顿法,收敛的也更快。

下面是我的代码复现。

BFGS算法

def bfgs_newton(f, x, iters):"""实现BFGS拟牛顿法:param f: 原函数:param x: 初始值:param iters: 遍历的最大epoch:return: 最终更新完毕的x值"""# 步长。设为1才能收敛,小于1不能收敛learning_rate = 1# 初始化B正定矩阵B = np.eye(2)x_len = x.shape[0]# 一阶导g的第二范式的最小值(阈值)epsilon = 1e-5for i in range(1, iters):g = jacobian(f, x)if np.linalg.norm(g) < epsilon:breakp = np.linalg.solve(B, g)# 更新x值x_new = x - p*learning_rateprint("第" + str(i) + "次迭代后的结果为:", x_new)g_new = jacobian(f, x_new)y = g_new - gk = x_new - xy_t = y.reshape([x_len, 1])Bk = np.dot(B, k)k_t_B = np.dot(k, B)kBk = np.dot(np.dot(k, B), k)# 更新B正定矩阵。完全按照公式来计算B = B + y_t*y/np.dot(y, k) - Bk.reshape([x_len, 1]) * k_t_B / kBkx = x_newreturn x

算法的执行效果如下:

可以看到,在第23次就收敛了。

DFP算法

def dfp_newton(f, x, iters):"""实现DFP拟牛顿算法:param f: 原函数:param x: 初始值:param iters: 遍历的最大epoch:return: 最终更新完毕的x值"""# 步长learning_rate = 1# 初始化B正定矩阵G = np.eye(2)x_len = x.shape[0]# 一阶导g的第二范式的最小值(阈值)epsilon = 1e-5for i in range(1, iters):g = jacobian(f, x)if np.linalg.norm(g) < epsilon:breakp = np.dot(G, g)# 更新x值x_new = x - p * learning_rateprint("第" + str(i) + "次迭代后的结果为:", x_new)g_new = jacobian(f, x_new)y = g_new - gk = x_new - xGy = np.dot(G, y)y_t_G = np.dot(y, G)yGy = np.dot(np.dot(y, G), y)# 更新G正定矩阵G = G + k.reshape([x_len, 1]) * k / np.dot(k, y) - Gy.reshape([x_len, 1]) * y_t_G / yGyx = x_newreturn x

算法执行效率如下:

可以看到,执行到1000次也没有收敛。由此证明了BFGS算法的收敛性确实要优于DFP算法。

最后,我还要提一提矩阵与向量的相关计算问题。我在这块儿吃了一些苦头,这儿推荐一篇博文,里面记录了相关知识点。因为我们传入的X实际上是一个一维向量,与二维矩阵做乘积运算时,不同的顺序所得到的结果会有不同,我们需要注意。

完整版代码在此处下载。

拟牛顿法实现(Python)相关推荐

  1. python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...

    原理什么的就不说了,只有代码... 十元二次目标函数,求极小值点. 1.最速下降法 import random import numpy as np import matplotlib.pyplot ...

  2. 拟牛顿法求解非线性方程组

    文章目录 牛顿法求解非线性方程组 拟牛顿法 案例 Python代码 牛顿法求解非线性方程组 假设有非线性方程组 f(x)=0f(x)=0f(x)=0, 解为x∗x^{*}x∗ f(x∗)=f(x~)+ ...

  3. 【Python篇】拟牛顿法面面俱到(一)--牛顿插值法

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习, ...

  4. python牛顿法与拟牛顿法_python牛顿法

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! plt.plot(xv, yv, label=track)#plt.plot(x ...

  5. python pandas库实现逻辑回归拟牛顿法求参数_python 牛顿法实现逻辑回归(Logistic Regression)...

    本文采用的训练方法是牛顿法(Newton Method). 代码 import numpy as np class LogisticRegression(object): ""&q ...

  6. python 拟牛顿法 求非线性方程_9-非线性优化

    本章内容: 介绍了无约束和有约束两种类型的非线性优化 一.无约束优化 无约束优化的一般形式为: 如果要求最大值,则 1.1 fminunc() 介绍:是MATLAB求解无约束优化的主要函数,算法有:信 ...

  7. python牛顿法与拟牛顿法_[机器学习必知必会]牛顿法与拟牛顿法

    前言 同梯度下降法一样,牛顿法和拟牛顿法也是求解无约束最优化问题的常用方法.牛顿法本身属于迭代算法,每一步需要求解目标函数的海赛矩阵的逆矩阵,计算比较复杂.拟牛顿法通过正定矩阵近似海赛矩阵的逆矩阵或海 ...

  8. python拟牛顿法迭代点绘制_拟牛顿法python

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根

    迭代法求非线性方程的根 迭代法是一种逐次逼近法.它是求解代数方程,超越方程及方程组的一种基本方法,但存在收敛性及收敛快慢的问题. 为了用迭代法求非线性方程f(x) = 0的近似根: 1.首先需要将此方 ...

最新文章

  1. 离线轻量级大数据平台Spark之读取CSV文件实例
  2. 一个简单的DWR入门例子
  3. 数据库分库分表的几种方式
  4. python 类的特殊成员(属性和方法)
  5. C#Socket通信
  6. Maven工作笔记-jar包打入本地仓库并打包
  7. Hibernate一对多映射示例注释
  8. python3 三级菜单-基础版
  9. attodiskbenchmarks(磁盘传输速率检测)_硬盘坏了可以修复吗?电脑硬盘检测?
  10. 第 16 章 模板方法模式
  11. chromium 一些设置 --插件安装
  12. [ABP开源项目]--vue+vuex+vue-router+EF的权限管理系统
  13. CSDN资源分享分红2元,哈哈
  14. bolt界面引擎学习笔记一
  15. Eclipse ADT版本低的问题
  16. fragment中高德地图定位
  17. python声音报警_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
  18. UA MATH563 概率论的数学基础 中心极限定理1 随机变量序列的收敛
  19. 复旦大学智能感知与无人系统实验室诚聘海内外超级博士后/博士后
  20. 计算机网络属性设置知识,系统属性设置快捷键

热门文章

  1. 年前最后一趟车,来年要少开车、慎开车
  2. python——金融商品收益率GARCH 模型构建(GARCH 模型)
  3. AVPlayer介绍
  4. M4核MCU MH32F103A,M4硬件完美兼容ST。
  5. memcpy函数的介绍以及实现
  6. 常见网络攻击与防御方法
  7. MSE RMSE PSNR SSIM
  8. 云计算机教室怎样使用,学校使用云教室是一种怎样的体验
  9. Word去除空白页,格式变动问题处理
  10. OSChina 周五乱弹 ——不知道假装开心,装的像么