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

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

时间: 2019-07-03

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

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

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

  2. 梯度下降法、随机梯度下降法、批量梯度下降法及牛顿法、拟牛顿法、共轭梯度法

    http://ihoge.cn/2018/GradientDescent.html http://ihoge.cn/2018/newton1.html 引言 李航老师在<统计学习方法>中将 ...

  3. 预处理共轭梯度(PCG)解线性联立方程(python,数值积分)

    第十四课 线性联立方程的预处理共轭梯度(PCG) 系数矩阵病态 百度解释:求解方程组时如果对数据进行较小的扰动,则得出的结果具有很大波动,这样的矩阵称为病态矩阵 在直接求解的诸多方法中,线性方程可能无 ...

  4. 机器学习深度学习知识点总结

    1.Overfitting是什么?怎么解决? overfitting就是过拟合, 其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在 ...

  5. 数据科学和机器学习中的优化理论与算法(下)

    数据科学和机器学习中的优化理论与算法(下) 数据科学和机器学习当前越来越热,其中涉及的优化知识颇多.很多人在做机器学习或者数据科学时,对其中和优化相关的数学基础,包括随机梯度下降.ADMM.KKT 条 ...

  6. Numerical Optimization Ch10. Least-Squares Problems

    第十章: 最小二乘问题 文章目录 第十章: 最小二乘问题 1. 背景介绍 2. 线性最小二乘问题及求解算法 2.1 基于Cholesky分解的直接法 2.2 基于QR分解的直接法 2.3 基于奇异值分 ...

  7. 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 ...

  8. SLAM综述性论文阅读手记

    ==1 简介== 古典年代(1986-2004):这一时期,引入了SLAM概率论推导方法,包括基于扩展卡尔曼滤波.粒子滤波和最大似然估计.第一个挑战是效率和数据关联(求解位姿)的鲁棒性问题. 算法分析 ...

  9. 数值计算方法计算机,数值计算方法

    常见"问题" 1.如何认识数值计算课程?它与数学学科的其它分支以及计算机的关系如何? 2.何为算法?如何判断数值算法的优劣? 3.数值计算方法中最关注哪些误差?为什么? 4.什么是 ...

最新文章

  1. Windows上安装Nacos
  2. [译] Flutter 从 0 到 1, 第二部分
  3. Mybatis错误:Parameter 'XXX' not found. Available parameters are [1, 0, param1, param2]
  4. virtualbox硬件加速_VirtualBox 安装Ubuntu虚拟机卡顿 加速方法以及出现的问题
  5. php 操作json的各种格式
  6. java卡片布局显示效果_三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)...
  7. 多核编程文章汇总[z]
  8. pca数学推导_PCA背后的统计和数学概念
  9. npm i依赖版本兼容问题处理
  10. (论文)WS-DAN (弱监督数据增强)
  11. AttributeError: ‘str‘ object has no attribute ‘copy
  12. 把爬取信息导出到mysql,关于爬虫学习的一些小小记录(四)——爬取数据存入数据库...
  13. C/C++——求数组长度及反序
  14. NSGA2算法原理及python实现
  15. 游戏开发中的脚本语言
  16. javaWeb框架开发
  17. 基于can总线的A2L文件解析(2)
  18. 微信小程序---授权保存图片或视频,拒绝后不在出现弹窗---自定义组件弹窗
  19. 大厂技术实现 | 爱奇艺短视频推荐业务中的多目标优化实践 @推荐与计算广告系列
  20. Geospatial-地理空间

热门文章

  1. 51单片机怎么显示当前时间_单片机初学者必看
  2. jquery实现对radio赋值
  3. 开源ETL软件在智能化集成系统中的应用
  4. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解
  5. 表头大小设置_Excel技巧:单线表头及多线表头的制作方法
  6. 解析并符号 读取dll_风电场用风功率采集测风塔数据报文格式解析浅谈
  7. tornado服务器动态文件,tornado 实现服务器消息推送功能
  8. cygwin学习linux命令,cygwin 在windows下使用linux命令的方法
  9. 深度学习(5)TensorFlow基础操作一: TensorFlow数据类型
  10. html中超链接使用_HTML实例源码