共轭梯度法原理与实现
来源:互联网 发布:小牛学堂大数据怎么样 编辑:程序博客网 时间:2024/06/06 06:30
- 共轭方向
- 定义
- 共轭方向的性质
- 共轭方向法
- 算法描述
- 算法的收敛性
- 搜索步长kalpha_k的确定
- 共轭梯度法
- 共轭梯度法的原理
- 共轭梯度算法描述
- 共轭梯度算法Python实现
- 共轭方向
所用例子:
求解二次目标函数极小点。设
其中
1.共轭方向
定义:
设
则称
当
即向量相互正交。由此可见共轭概念是正交概念的推广,正交概念是共轭概念的特例。
共轭方向的性质
- 若非零向量
d1,d2,⋯,dm 对于对称正定矩阵G 共轭,则这m 个向量线性无关。 - 在
n 维空间中互相共轭的非零向量不超过n 个。 - 从任意初始点出发,依次沿
n 个G的共轭方向d1,d2,⋯,dm 进行一维寻优,最多经过n 次寻优就可以找到二次函数的极小值点。
2.共轭方向法
算法描述
step 1 : 给定迭代精度
0≤ϵ≪1 和初始点x0 . 计算g0=∇f(x0) . 选取初始方向d0 ,使得dT0g0<0 . 令k←0 .
step 2 : 若||gk||≤ϵ ,停止迭代,输出x∗≈xk
step 3 : 确定搜索步长αk
step 4 : 令xk+1←xk+αkdk ,并计算gk+1=∇f(xk+1)
step 5 : 选取dk+1 满足如下下降性和共轭性条件:dTk+1gk+1<0,dTk+1Gdi=0,i=0,1,⋯,k
step 6 :k←k+1 ,转step 2
算法的收敛性
设目标函数为之前定义的
中的极小点。特别地,
证明:有
设任意
记
利用泰勒展开公式,有
下面只需证明
即可。实际上,因
故当
故每一步迭代
中的极小点。
搜索步长αk 的确定
设
将其改写成如下形式
然后从逐步寻优的角度分析该式,可以把
可以将视
对向量
进而得到步长
对向量
从而得到
将该等式带入到
对二次目标函数,其在
G(x^*-x_k)=\left[g(x^*)-b\right]-\left[g(x_k)-b\right]\\\qquad\quad=g(x^*)-g(x_k)=0-g(x_k)\\=-g(x_k)\qquad\qquad
最后得到
用共轭方向法的思想可以解决前面给出的二次目标函数
3.共轭梯度法
共轭梯度法的原理
在寻优过程中利用当前点
其修正系数
修正系数
可以看出共轭梯度法的搜索方向
共轭梯度算法描述
step 1 : 给定迭代精度
0≤ϵ≪1 和初始点x0 . 计算g0=∇f(x0) . . 令k←0 .
step 2 : 若||gk||≤ϵ ,停止迭代,输出x∗≈xk
step 3 : 计算搜索方向dk
dk={−gk−gk+βk−1dk−1k=0k≥1
step 4 : 利用线搜索方法确定搜索步长αk
step 5 : 令 令xk+1←xk+αkdk ,并计算gk+1=∇f(xk+1)
step 6 :k←k+1 ,转step 2
说明:
通常来说,共轭梯度法的收敛速度比最速下降法快,而且不用像牛顿法那样计算海森矩阵及其逆矩阵。但是随着迭代次数的增加,新构造的共轭方向由于误差(如果目标函数不是二次函数则会造成这种误差)积累会逐渐不精确甚至不下降,可能出现收敛速度极慢的现象。为了避免这种现象,一种有效的改进办法是:
每迭代
共轭梯度算法Python实现
def frcg(fun,gfun,x0): #用FR共轭梯度法求解无约束问题 #x0是初始点,fun和gfun分别是目标函数和梯度 #x,val分别是近似最优点和最优值,k是迭代次数 maxk = 5000 rho = 0.6 sigma = 0.4 k = 0 epsilon = 1e-5 n = np.shape(x0)[0] itern = 0 while k < maxk: 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 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 x0 += rho**mk*dk g0 = gk d0 = dk k += 1 return x0,fun(x0),k
性能展示
与拟牛顿法http://blog.csdn.net/u012176591/article/details/46225289 对比,发现共轭梯度法还是挺挫的,需要的迭代次数很多,超过一半的样本的迭代次数超过500(上图没有显示)。
作图代码:
n = 50x = y = np.linspace(-10,10,n)xx,yy = np.meshgrid(x,y)data = [[xx[i][j],yy[i][j]] for i in range(n) for j in range(n)]iters = []for i in xrange(np.shape(data)[0]): rt = frcg(fun,gfun,data[i]) if rt[2] <=200: iters.append(rt[2]) if i%100 == 0: print i,rt[2]plt.hist(iters,bins=50)plt.title(u'共轭梯度法迭代次数分布',{'fontname':'STFangsong','fontsize':18})plt.xlabel(u'迭代次数',{'fontname':'STFangsong','fontsize':18})plt.ylabel(u'频率分布',{'fontname':'STFangsong','fontsize':18})
参考文献:
- http://en.wikipedia.org/wiki/Conjugate_gradient_method
- An Introduction to the Conjugate Gradient Method
- 共轭梯度法原理与实现
- 共轭梯度法原理
- 浅谈共轭梯度法的原理
- Matlab实现FR共轭梯度法
- python实现共轭梯度法求解方程组
- 牛顿法与共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 优化 :共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 共轭梯度法
- 共轭方向法和共轭梯度法
- 用MATLAB实现FR共轭梯度法求解实例
- poj 1258 Agri-Net 【最小生成树 基础题】
- OK6410挂载Ubuntu12.04中NFS文件系统
- 如何下载STM32固件库----2015/5/29
- CSS知识总结
- 以Python Imaging Library 进行影像资料处理PIL
- 共轭梯度法原理与实现
- java连接SQL数据库
- HDU-1233 最小生成树 Prim算法
- oracle 数据库基本命令
- [Python]网络爬虫(七):Python中的正则表达式教程
- java之单元测试
- select 查询语句的小尾巴~~~啦啦啦啦啦
- BestCoder Round #4
- [Python]项目打包:5步将py文件打包成exe文件