共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算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实现共轭梯度法

本文地址: http://www.cppcns.com/jiaoben/python/264414.html

线性共轭梯度法python_python实现共轭梯度法相关推荐

  1. 线性共轭梯度法python_python实现的共轭梯度法

    共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有 ...

  2. 线性共轭梯度法python_Python中实现共轭梯度法的案例

    Python中实现共轭梯度法的案例 发布时间:2020-11-03 09:34:25 来源:亿速云 阅读:80 作者:小新 小编给大家分享一下Python中实现共轭梯度法的案例,相信大部分人都还不怎么 ...

  3. matlab 截断共轭梯度法,最优化作业 共轭梯度法 matlab代码

    syms f x1 x2 f=(1/2)*x1^2+x2^2; x=[2;1]; a=[1 0;0 2];% A g1=diff(f,x1); g2=diff(f,x2); g=[g1;g2];%导数 ...

  4. 基于共轭梯度法的对抗攻击

    1 引言  深度学习模型容易受到对抗样本的攻击,尽管基于最速下降的现有方法已经取得了很高的攻击成功率,但优化的病态问题偶尔会降低它们的攻击性能.为了解决这个问题,在该论文中作者借鉴对此类问题有效的共轭 ...

  5. 共轭复数,共轭根式,共轭矩阵,共轭方向,共轭方向法,共轭梯度法,共轭分布,共轭函数,傅里叶变换的共轭对称

    目录 1. 共轭复数 2. 傅里叶变换的共轭对称性 3. 共轭根式(radical conjugates) 4. 共轭矩阵(自共轭矩阵.Hermitian(埃尔米特)矩阵) 5. 共轭方向 6. 共轭 ...

  6. 常用的优化算法:梯度下降法,牛顿法,拟牛顿法,共轭梯度法

    目录 0.几个数学概念 1. 梯度下降法(Gradient Descent) 2. 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods) 3. 共轭 ...

  7. 最优化方法-共轭梯度法

    最优化方法-共轭梯度法 1.简介 共轭梯度法最初由Hesteness和Stiefel于1952年为求解线性方程组而提出的.其基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向, ...

  8. matlab中sqp的算法原理_最优化方法及其Matlab程序设计 马昌凤

    内容简介<最优化方法及其Matlab程序设计>较系统地介绍了非线性最优化问题的基本理论和算法,以及主要算法的Matlab程序设计,主要内容包括(精确或非精确)线搜索技术.最速下降法与(修正 ...

  9. matlab程序神经网络的,matlab 通用神经网络代码(转)

    感应器神经网络.线性网络.BP神经网络.径向基函数网络 %通用感应器神经网络. P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1 50];%输入向量 T=[1 1 0 ...

  10. 常用机器学习算法汇总比较(完)

    机器学习入门系列(2)–如何构建一个完整的机器学习项目,第九篇! 该系列的前八篇文章: 机器学习入门系列(2)–如何构建一个完整的机器学习项目(一) 机器学习数据集的获取和测试集的构建方法 特征工程之 ...

最新文章

  1. Exchange 2010 OAB无法更新
  2. TensorFlow 学习(十一)—— 正则(regularizer)
  3. pygame模块_pygame模块方法和事件
  4. 计算机网络安全与防护第三版课后答案,网络安全与防护—笔试题答案
  5. 实战 Kaggle 比赛:图像分类(CIFAR-10) 动手学深度学习v2
  6. MATLAB2016笔记(六):数据可视化
  7. [matlab也能用来机器学习!?]保存工具箱模型并使用模型预测结果
  8. boost asio异步服务端实现步骤
  9. AMP—Rover移植
  10. echoServer回显服务器
  11. YII2.0电商平台开发笔记
  12. 密码学的安全性浅析3
  13. 显示gsensor即时数据的apk 用gsensor来判断手机的静和动 气压计的测试应用
  14. Iphone手机被偷了 我是如何自保和尝试找回的
  15. 一周信创舆情观察(1.18~1.24)
  16. 特斯拉无人驾驶最核心的人工智能算法,竟是强化学习
  17. pdffactory 打印字体_PDF文件打印 pdfFactory Pro v7.41
  18. dn什么意思_DN是什么意思中文翻译
  19. Mindjet MindManager 2021思维导图Keygen教程分享
  20. java veloce 2017_新品速递:JAVA双雄耀世登场

热门文章

  1. linux镜像迅雷下载,【转】红帽 Red Hat Linux相关产品iso镜像下载【迅雷快传】【百度云】【更新7.1】...
  2. Centos8下nginx源码编译安装
  3. Honeywell1900霍尼韦尔 扫描二维码 QT 客户端显示数据
  4. 广州橙优设计:学习UI需要那些?UI设计必须会的软件
  5. Visual C++ 6.0 Processor Pack 编译xvidcore1.1.0
  6. 概率论与数理统计(陈希孺)笔记2.1
  7. 矩阵分析与应用+张贤达
  8. 为什么chrome视频时卡得厉害(by quqi99)
  9. 计算机输入码分类,汉字输入码种类数字编码.ppt
  10. Java代码实现时钟