博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
共轭方向法、共轭梯度法
阅读量:7065 次
发布时间:2019-06-28

本文共 1668 字,大约阅读时间需要 5 分钟。

(FR)共轭梯度法是介于最速下降法和牛顿法之间的一个方法,相比最速下降法收敛速度快,并且不需要像牛顿法一样计算Hesse矩阵,只需计算一阶导数

 

共轭梯度法是共轭方向法的一种,意思是搜索方向都互相共轭

共轭的定义如下:

 

 

共轭梯度法是一种典型的共轭方向法,它的搜索方向是负梯度方向和上一次搜索方向的一个组合

关于βk-1,有两种常用的计算公式

(PRP公式)

(PRP公式)

 

预处理共轭法改善了G的条件数,使算法的收敛速度加快

预处理的方法是寻找一个非奇异矩阵C,使得C-TGC-1的条件数小于G的条件数

 

再开始共轭梯度法是满足某一条件后重新使用最速下降方向作为搜索方向,这个条件包括迭代n步,或共轭梯度方向是上升方向

 

下面给出这几种方法的python实现

FR共轭梯度法:

# coding=utf-8# FR-CG共轭梯度法from linear_search.Function import *from linear_search.wolfe import *import numpy as npdef conjugate(_f, _x):    fun = Function(_f)    x = array(_x)    d = -fun.grad(x)    while fun.norm(x) > 0.01:        alpha = wolfe(_f, x, d)        g = np.mat(fun.grad(x))        beta = 1 / np.dot(g, g.T)        x = x + alpha * d        g = np.mat(fun.grad(x))        beta = beta * np.dot(g, g.T)        d = array(-g + beta * d)[0]    return x

 再开始共轭梯度法:

# coding=utf-8# 再开始共轭梯度法from linear_search.Function import *from linear_search.wolfe import *import numpy as npdef restart_conjugate(_f, _x, n):    fun = Function(_f)    x = array(_x)    while True:        d = -fun.grad(x)        k=0        if(np.linalg.norm(d)<0.01):            break        while fun.norm(x) > 0.01:            g = np.mat(fun.grad(x))            alpha = wolfe(_f, x, d)            x = x + alpha * d            k=k+1            g1= np.mat(fun.grad(x))            if np.dot(g1,g.T)/np.dot(g1,g1.T)>0.1 or k>=n:                if np.linalg.norm(g1)<0.01:                    return x                break            else:                beta = np.dot(g1, g1.T) / np.dot(g, g.T)                d = array(-g + beta * d)[0]                if np.dot(mat(d),g1.T)>0:                    break    return x

 

转载于:https://www.cnblogs.com/kisetsu/p/9159783.html

你可能感兴趣的文章
java io nio nio2_Java 对象序列化 NIO NIO2详细介绍及解析
查看>>
java中的pattern_JAVA中Pattern和Matcher的用法
查看>>
java登录有次数限制_[Java教程]限制登录次数
查看>>
java的classpath路径_Java项目下的classpath路径包括哪里-Go语言中文社区
查看>>
android java 数组转字符串_android112 jni 把java的字符串转换成c的字符串,数组处理...
查看>>
java判断csv文件为空_在java中解析CSV文件,并使用空值进行delaing
查看>>
java邮件模板代码_Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)
查看>>
java websocket 实现_Java 项目中的 WebSocket 实现
查看>>
cmd接收mysql显示问号_MySQL_JDBC链接mysql插入数据后显示问号的原因及解决办法,1.在cmd中进入mysql查看默认的编 - phpStudy...
查看>>
java连不上sql表_Java与数据库的多表连接不能进行
查看>>
java和angular网页制作_使用Java 8,Spring Boot和Angular创建简单的Web应用程序
查看>>
java字段不序列化注解_gson:如何在没有注释的情况下从序列化中排除特定字段...
查看>>
java截取字符串第二次字母_java截取字符串中出现次数最多的字母
查看>>
java教务选课系统源代码_基于jsp的教务选课系统-JavaEE实现教务选课系统 - java项目源码...
查看>>
java通过文件名运行_Java 从返回文件名获取内容类型
查看>>
java中双精度型变量_java中的基本数据类型
查看>>
java运行csh文件_Java,Prel,Csh界面
查看>>
java match详解_Match类解析
查看>>
java json转抽象对象_java Bean与json对象间的转换实例讲解
查看>>
java to vb converter_VB源码转换工具(VBto Converter)
查看>>