共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

算法步骤:

import random

import numpy as np

import matplotlib.pyplot as plt

def goldsteinsearch(f,df,d,x,alpham,rho,t):

'''

线性搜索子函数

数f,导数df,当前迭代点x和当前搜索方向d,t试探系数>1,

'''

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 Wolfesearch(f,df,d,x,alpham,rho,t):

'''

线性搜索子函数

数f,导数df,当前迭代点x和当前搜索方向d

σ∈(ρ,1)=0.75

'''

sigma=0.75

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 abs(np.dot(df(x + alpha * d),d))<=-sigma*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 frcg(fun,gfun,x0):

# x0是初始点,fun和gfun分别是目标函数和梯度

# x,val分别是近似最优点和最优值,k是迭代次数

# dk是搜索方向,gk是梯度方向

# epsilon是预设精度,np.linalg.norm(gk)求取向量的二范数

maxk = 5000

rho = 0.6

sigma = 0.4

k = 0

epsilon = 1e-5

n = np.shape(x0)[0]

itern = 0

W = np.zeros((2, 20000))

f = open("共轭.txt", 'w')

while k < maxk:

W[:, k] = x0

gk = gfun(x0)

itern += 1

itern %= n

if itern == 1:

dk = -gk

else:

beta = 1.0 * np.dot(gk, gk) / np.dot(g0, g0)

dk = -gk + beta * d0

gd = np.dot(gk, dk)

if gd >= 0.0:

dk = -gk

if np.linalg.norm(gk) < epsilon:

break

alpha=goldsteinsearch(fun,gfun,dk,x0,1,0.1,2)

# alpha=Wolfesearch(fun,gfun,dk,x0,1,0.1,2)

x0+=alpha*dk

f.write(str(k)+' '+str(np.linalg.norm(gk))+"\n")

print(k,alpha)

g0 = gk

d0 = dk

k += 1

W = W[:, 0:k+1] # 记录迭代点

return [x0, fun(x0), k,W]

def fun(x):

return 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2

def gfun(x):

return np.array([-400 * x[0] * (x[1] - x[0] ** 2) - 2 * (1 - x[0]), 200 * (x[1] - x[0] ** 2)])

if __name__=="__main__":

X1 = np.arange(-1.5, 1.5 + 0.05, 0.05)

X2 = np.arange(-3.5, 4 + 0.05, 0.05)

[x1, x2] = np.meshgrid(X1, X2)

f = 100 * (x2 - x1 ** 2) ** 2 + (1 - x1) ** 2 # 给定的函数

plt.contour(x1, x2, f, 20) # 画出函数的20条轮廓线

x0 = np.array([-1.2, 1])

x=frcg(fun,gfun,x0)

print(x[0],x[2])

# [1.00318532 1.00639618]

W=x[3]

# print(W[:, :])

plt.plot(W[0, :], W[1, :], 'g*-') # 画出迭代点收敛的轨迹

plt.show()

代码中求最优步长用得是goldsteinsearch方法,另外的Wolfesearch是试验的部分,在本段程序中不起作用。

迭代轨迹:

三种最优化方法的迭代次数对比:

最优化方法

最速下降法

共轭梯度法

牛顿法

迭代次数

1702

240

5

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python怎么取共轭_python实现共轭梯度法相关推荐

  1. python怎么取共轭_python print出共轭复数的方法详解

    python print出共轭复数的方法详解 发布时间:2020-09-21 01:42:19 来源:脚本之家 阅读:92 作者:爱喝马黛茶的安东尼 复数是由一个实数和一个虚数组合构成,表示为:x+y ...

  2. python怎么取共轭_python矩阵运算,转置,逆运算,共轭矩阵实例

    我就废话不多说了,大家还是直接看代码吧! #先定义两个矩阵 X=np.array([[1,2104,5,1,45],[1,1416,3,2,40],[1,1534,3,2,30],[1,852,2,1 ...

  3. python爬取资料_Python爬取FLASH播放器中的资料

    Python爬取FLASH播放器中的资料. 一.首先了解一下AMF协议:AMF(Action Message Format)是Flash与服务端通信的一种常见的二进制编码模式,其传输效率高,可以在HT ...

  4. python爬取评论_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  5. python爬取王者_python 爬取王者荣耀高清壁纸

    一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 预览一下桌面吧: 是不是看着这样的桌面也很带感,_ (学会这个技术,你可以爬取其他网站的类似图片 ...

  6. python向上取整_python向上取整

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! import math f = 11.2print math.ceil(f) # ...

  7. python爬取歌曲_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  8. python爬取电子书_python爬取计算机电子书(源码移步github)

    摘要:今年第一个项目,python爬取网络上公开的计算机电子书近8000本,在此基础上简要分析计算机专业的发展变迁.部分整理好的书籍下载链接见文末.代码链接见文末. 计算机诞生以来不到100年,学术的 ...

  9. python爬取天猫_Python如何抓取天猫商品详细信息及交易记录

    本文实例为大家分享了Python抓取天猫商品详细信息及交易记录的具体代码,供大家参考,具体内容如下 一.搭建Python环境 本帖使用的是Python 2.7 涉及到的模块:spynner, scra ...

最新文章

  1. html jsf ajax blur,JSF和AJAX:隐藏网站的一部分,直到第一个Ajax请求
  2. 还在搜百度图片?太LOW了!
  3. JSP实战型程序连载:通用数据库连接JavaBean
  4. 计算机工程与应用查重吗,计算机工程期刊录用率_计算机工程与应用期刊_计算机八大核心期刊...
  5. 欢迎使用CSDN-markdown编辑器-入门
  6. Ubuntu香港apt-get源
  7. Linux下c语言实现通讯录,学生通讯录管理系统linux下C语言
  8. matlab的findpeak 极点查找
  9. git commit --amend两种用法
  10. mysql资源估算_关于数据库查询要耗费的服务器资源估算!高手进~
  11. 批量转换Caltech Pedestrian Dataset中annotations中的.vbb文件为.txt文件
  12. 新书上市|这套北大数学系青睐的数学科普书,又添新成员
  13. 你想要的宏基因组-微生物组知识全在这(2020.9)
  14. 用python做股票因子分析_因子分析(by+alphalens)
  15. 【RFID】阅读器和应答器之间的电感耦合
  16. MXNet网络模型(四)GAN神经网络
  17. php开发erp思路,ERP遇到业务逻辑问题,求思路
  18. Week1.3-金融会计指标案例分析
  19. elasticsearch7.1.1入门之集群的基础配置
  20. 机器学习笔记--微积分

热门文章

  1. android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
  2. Android之图片压缩
  3. Sonic安装部署之——iOS设备接入
  4. win10 更新Node JS和npm
  5. gg 修改器游戏被保护_王者荣耀安卓和IOS修改超长游戏名字方法
  6. set的用法及短语_set的用法和短语例句
  7. 使用kafka-reassign-partitions.sh重新对topic分区,ReplicationFactor由1变成3
  8. Win32串口API
  9. 微信小程序怎么添加到主屏幕将微信小程序放到手机桌面?
  10. 大数据可视化大屏展示