拟牛顿法实现(Python)
接着上篇写的牛顿法,我们继续来研究牛顿法的改进方法——拟牛顿法。
拟牛顿法其实也是很简单了。为什么要研究出这种方法呢,就是因为常规的牛顿法每次迭代更新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)相关推荐
- python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...
原理什么的就不说了,只有代码... 十元二次目标函数,求极小值点. 1.最速下降法 import random import numpy as np import matplotlib.pyplot ...
- 拟牛顿法求解非线性方程组
文章目录 牛顿法求解非线性方程组 拟牛顿法 案例 Python代码 牛顿法求解非线性方程组 假设有非线性方程组 f(x)=0f(x)=0f(x)=0, 解为x∗x^{*}x∗ f(x∗)=f(x~)+ ...
- 【Python篇】拟牛顿法面面俱到(一)--牛顿插值法
感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习, ...
- python牛顿法与拟牛顿法_python牛顿法
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! plt.plot(xv, yv, label=track)#plt.plot(x ...
- python pandas库实现逻辑回归拟牛顿法求参数_python 牛顿法实现逻辑回归(Logistic Regression)...
本文采用的训练方法是牛顿法(Newton Method). 代码 import numpy as np class LogisticRegression(object): ""&q ...
- python 拟牛顿法 求非线性方程_9-非线性优化
本章内容: 介绍了无约束和有约束两种类型的非线性优化 一.无约束优化 无约束优化的一般形式为: 如果要求最大值,则 1.1 fminunc() 介绍:是MATLAB求解无约束优化的主要函数,算法有:信 ...
- python牛顿法与拟牛顿法_[机器学习必知必会]牛顿法与拟牛顿法
前言 同梯度下降法一样,牛顿法和拟牛顿法也是求解无约束最优化问题的常用方法.牛顿法本身属于迭代算法,每一步需要求解目标函数的海赛矩阵的逆矩阵,计算比较复杂.拟牛顿法通过正定矩阵近似海赛矩阵的逆矩阵或海 ...
- python拟牛顿法迭代点绘制_拟牛顿法python
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根
迭代法求非线性方程的根 迭代法是一种逐次逼近法.它是求解代数方程,超越方程及方程组的一种基本方法,但存在收敛性及收敛快慢的问题. 为了用迭代法求非线性方程f(x) = 0的近似根: 1.首先需要将此方 ...
最新文章
- 离线轻量级大数据平台Spark之读取CSV文件实例
- 一个简单的DWR入门例子
- 数据库分库分表的几种方式
- python 类的特殊成员(属性和方法)
- C#Socket通信
- Maven工作笔记-jar包打入本地仓库并打包
- Hibernate一对多映射示例注释
- python3 三级菜单-基础版
- attodiskbenchmarks(磁盘传输速率检测)_硬盘坏了可以修复吗?电脑硬盘检测?
- 第 16 章 模板方法模式
- chromium 一些设置 --插件安装
- [ABP开源项目]--vue+vuex+vue-router+EF的权限管理系统
- CSDN资源分享分红2元,哈哈
- bolt界面引擎学习笔记一
- Eclipse ADT版本低的问题
- fragment中高德地图定位
- python声音报警_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
- UA MATH563 概率论的数学基础 中心极限定理1 随机变量序列的收敛
- 复旦大学智能感知与无人系统实验室诚聘海内外超级博士后/博士后
- 计算机网络属性设置知识,系统属性设置快捷键