python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...
原理什么的就不说了,只有代码。。。
十元二次目标函数,求极小值点。
1.最速下降法
import random
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
def goldsteinsearch(f, df, d, x, alpham, rho, t):
flag = 0
a = 0
b = alpham
fk = f(x)
gk = df(x)
phi0 = fk
dphi0 = np.dot(gk, d)
alpha = b * random.uniform(0, 1)
while (flag == 0):
newfk = f(x + alpha * d)
phi = newfk
# print(phi,phi0,rho,alpha ,dphi0)
if (phi - phi0) <= (rho * alpha * dphi0):
if (phi - phi0) >= ((1 - rho) * alpha * dphi0):
flag = 1
else:
a = alpha
b = b
if (b < alpham):
alpha = (a + b) / 2
else:
alpha = t * alpha
else:
a = a
b = alpha
alpha = (a + b) / 2
return alpha
def steepest(fun, gfun,x0):
c = 0.00001
imax = 100
i = 1
x = x0
grad = gfun(x)
delta = sum(grad**2)
while i < imax and delta > c:
p = -gfun(x)
alpha = goldsteinsearch(fun, gfun, p, x, 1, 0.1, 2)
x = x + alpha * p
print(i, np.array((i, delta)))
grad = gfun(x)
delta = sum(grad**2)
i = i + 1
return x, fun(x), i, delta
#目标函数
fun = lambda x: (x[0]-1)**2+(x[1]-1)**2+(x[2]-2)**2+(x[3]-3)**2+(x[4]-4)**2+(x[5]-5)**2+(x[6]-6)**2+(x[7]-7)**2+(x[8]-8)**2+(x[9]-9)**2+x[0]*x[1]+x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+x[8]*x[9]
#一阶导数
gfun = lambda x: np.array([2*x[0] + x[1] - 2, x[0] + 2*x[1] - 2, 2*x[2] + x[3] - 4, x[2] + 2*x[3] - 6, 2*x[4] + x[5] - 8, x[4] + 2*x[5] - 10, 2*x[6] + x[7] - 12, x[6] + 2*x[7] - 14, 2*x[8] + x[9] - 16, x[8] + 2*x[9] - 18])
if __name__ == "__main__":
x0 = np.array([1.0,1.0,1.0,3.0,1.0,3.0,1.0,1.0,2.0,3.0])
steepest(fun, gfun,x0)
output = steepest(fun, gfun,x0)
print ("迭代次数:" output [2])
print ("近似最优解:" output [0])
print ("函数极小值点:" output [1])
print ("最终迭代误差:" output [3])
2.牛顿法
import random
import numpy as np
import matplotlib.pyplot as plt
def dampnm(fun, gfun, hess, x0):
maxk = 500
rho = 0.55
sigma = 0.4
k = 0
delta = 1e-5
_delta=delta
while k < maxk:
gk = gfun(x0)
Gk = hess(x0)
dk = -1.0 * np.linalg.solve(Gk, gk)
print(k, np.linalg.norm(dk))
if np.linalg.norm(dk) < delta:
_delta = np.linalg.norm(dk)
break
x0 += dk
k += 1
return x0, fun(x0), k,_delta
#目标函数
fun = lambda x: (x[0]-1)**2+(x[1]-1)**2+(x[2]-2)**2+(x[3]-3)**2+(x[4]-4)**2+(x[5]-5)**2+(x[6]-6)**2+(x[7]-7)**2+(x[8]-8)**2+(x[9]-9)**2+x[0]*x[1]+x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+x[8]*x[9]
#一阶导数
gfun = lambda x: np.array([2*x[0] + x[1] - 2, x[0] + 2*x[1] - 2, 2*x[2] + x[3] - 4, x[2] + 2*x[3] - 6, 2*x[4] + x[5] - 8, x[4] + 2*x[5] - 10, 2*x[6] + x[7] - 12, x[6] + 2*x[7] - 14, 2*x[8] + x[9] - 16, x[8] + 2*x[9] - 18])
#二阶导数,也就是海森矩阵,幂次只有二次,所有二阶导是常数
hess = lambda x: np.array([[2, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 2, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 2, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 2]])
if __name__ == "__main__":
x0 = np.array([1.0,1.0,1.0,3.0,1.0,3.0,1.0,1.0,2.0,3.0])
output=dampnm(fun, gfun, hess, x0)
print ("迭代次数:" output [2])
print ("近似最优解:" output [0])
print ("函数极小值点:" output [1])
print ("最终迭代误差:" output [3])
3.拟牛顿法
import numpy as np
def bfgs(fun,gfun,x0):#这里只写出了bfgs的实现
maxk = 1e5
rho = 0.55
sigma = 0.4
epsilon = 1e-5
k = 0
n = np.shape(x0)[0]
Bk = np.eye(n)#np.linalg.inv(hess(x0))
_epsilon=epsilon
while k < maxk:
gk = gfun(x0)
print(k,np.linalg.norm(gk))
if np.linalg.norm(gk) < epsilon:
_epsilon=np.linalg.norm(gk)
break
dk = -1.0*np.linalg.solve(Bk,gk)
m = 0
mk = 0
while m < 20:
if fun(x0+rho**m*dk) < fun(x0)+sigma*rho**m*np.dot(gk,dk):
mk = m
break
m += 1
#BFGS
x = x0 + rho**mk*dk
sk = x - x0
yk = gfun(x) - gk
if np.dot(sk,yk) > 0:
Bs = np.dot(Bk,sk)
ys = np.dot(yk,sk)
sBs = np.dot(np.dot(sk,Bk),sk)
Bk = Bk - 1.0*Bs.reshape((n,1))*Bs/sBs + 1.0*yk.reshape((n,1))*yk/ys
k += 1
x0 = x
return x0,fun(x0),k,_epsilon#
#目标函数
fun = lambda x: (x[0]-1)**2+(x[1]-1)**2+(x[2]-2)**2+(x[3]-3)**2+(x[4]-4)**2+(x[5]-5)**2+(x[6]-6)**2+(x[7]-7)**2+(x[8]-8)**2+(x[9]-9)**2+x[0]*x[1]+x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+x[8]*x[9]
#一阶导
gfun = lambda x: np.array([2*x[0] + x[1] - 2, x[0] + 2*x[1] - 2, 2*x[2] + x[3] - 4, x[2] + 2*x[3] - 6, 2*x[4] + x[5] - 8, x[4] + 2*x[5] - 10, 2*x[6] + x[7] - 12, x[6] + 2*x[7] - 14, 2*x[8] + x[9] - 16, x[8] + 2*x[9] - 18])
if __name__ == "__main__":
x0 = np.array([1.0,1.0,1.0,3.0,1.0,3.0,1.0,1.0,2.0,3.0])
output=bfgs(fun, gfun, x0)
print ("迭代次数:" output [2])
print ("近似最优解:" output [0])
print ("函数极小值点:" output [1])
print ("最终迭代误差:" output [3])
这里是同一个目标函数在三种方法下的结果:近似最优解极小值迭代次数最终误差
最速下降法[0.66665596 0.66665596 0.66665596 2.66665596 2.00003211 4.00003211 3.33440243 5.33247832 4.66724938 6.66628733]92.666 66 7892774127.0733410524
04242e-06
牛顿法[0.66666667 0.66666667 0.66666667 2.66666667 2. 4. 3.33333333 5.33333333 4.66666667 6.66666667]92.6666666666666710
拟牛顿法[0.66666652 0.66666652 0.66666652 2.66666652 2.00000043 4.00000043 3.33333781 5.33333172 4.66666955 6.6666665 ]92.6666666666905739.86253776
2278836e-06
如果不考虑计算二阶导的支出,牛顿法还是比较生猛的。
完了-´•ᴥ•`。
如有兴趣,可参考博客:最速下降法(梯度下降法)python实现_Big_Pai的博客-CSDN博客_最速下降法pythonblog.csdn.net
python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...相关推荐
- python拟牛顿法迭代点绘制_拟牛顿法python
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python科学计算教程视频_【P14】Python科学计算与图形渲染库视频课程视频教程 it教程...
Python视频教程名称: Python科学计算与图形渲染库视频课程视频教程 Python视频教程 [IT视频教程网-www.itspjc.com] it教程 6 T6 ^9 L+ E4 C, }0 ...
- 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?
学软件开发的都知道实战项目对于学好一门语言是很重要的.在这里可以向大家推荐几个Python实战项目 项目1.Python 图片转字符画 本课程用 50 行 Python 代码完成图片转字符画小工具.通 ...
- python制作一个教学网站_小白如何入门Python? 制作一个网站为例
首先最重要的问题是为什么要学习python?这个问题这个将指导你如何学习Python和学习的方式. 以你最终想制作一个网站为例.从一个通用的学习资源列表开始不仅会消磨你的激情,而且你获得的知识很难应用 ...
- python金融工程的工具包_金融工程及其Python应用
目 录 第1章 金融工程导论 1 1.1 金融工程的概念 2 1.2 国外现代主流金融理论发展历程 2 1.3 国内金融的发展 3 1.4 现代主流金融理论简介 4 1.4.1 投资组合理论 4 1. ...
- python编程思维导图_用来梳理 Python 编程核心知识15张思维导图
原标题:用来梳理 Python 编程核心知识15张思维导图 小编这次在逛论坛的时候,无意中发现了一份python的武功秘籍,也就是一份思维导图,堪称业界经典! 思维导图可以有力地激发你的联想,通过一个 ...
- python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程
本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...
- python能开发什么产品_三周学 Python ?不,三周做个产品
我的同事在看到毫无开发经验的我用三周时间,不但从零基础用上了 Python,还做出了一个客户关系管理系统,强烈邀请我分享经验.惶恐,因为我并没有出色的智商,也没有觉得三周学 Python 是一个体现自 ...
最新文章
- 【camera】基于YOLO的车辆多维特征识别系统(车色,车品牌,车标,车型)与PYQT实现(课程设计)
- cuda cudnn pytorch版本对应关系
- Java学习总结:53(单对象保存父接口:Collection)
- ICLR2020 NLP优秀论文分享(附源码)
- ffmpeg文件拼接
- C++ dll 动态链接库的创建与调用
- 3ds Max制作客厅场景实例教程
- 【机器学习基础】一文归纳AI调参炼丹之法
- Android Studio 约束布局[ConstraintLayout]
- vue上传文件php,php文件上传 – 前端开发,JQUERY特效,全栈开发,vue开发
- C# WPF MVVM模式Prism框架下事件发布与订阅
- 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN
- 通过printf从目标板到调试器的输出
- 【python零基础入门学习】Python入门,带你快速学习,Python 环境搭建
- 来啊,一起造作啊!10月仍然还有十多场新品发布会...
- PHP+MySQL实现读写分离
- 【优化求解】基于matlab NSGA2算法多技能员工调度优化模型【含Matlab源码 1775期】
- 黑客(一):黑客守则
- android升级mcu升级,车载mcu需要升级吗_车载mcu升级有什么用
- 微信开发者工具整个是个浏览器
热门文章
- 逆向工程核心原理学习笔记(七):总结
- 【网络编程】之二、socket API学习
- python实现栈,实现push(),pop(),top(),getMin()方法
- 经典面试|为何Kafka这么快?
- 【线上分享】安防视频上云趋势、痛点,华为云视频接入服务探索及实践
- 音视频技术开发周刊 | 174
- 移动端视频缓存保障与CDN调度优化
- 设计模式C++实现(5)——原型模式
- zookeeper常见问题总结
- ffmpeg源码学习之time_base