Conjugate Gradient Methods

1. Introduction

CG is invected last centry (1952 by Hestenes and Stiefel), for solve “large” problems, as they didn’t have the powerful computer as we do. The same motive can for the present development.
The main property of CG is :

  • It donnot need to save the exact form of Hessien matrix.(which could be extremely large for large problems)
  • It won’t solve the inverse of the Hessien, it only need to calculate the dot product with a input vector.

CG方法一开始发明在上个世纪(1952年,Hestenes and Stiefel),作为直接求解的方法,一开始的动力是因为那时代的电脑完全没有我们现在的电脑强大。在更早的时候,甚至没有电脑存在,那种情况下使用基础的牛顿法求解一个几百个参数的系统,几乎是不可能的(因为我们要对一个100x100的矩阵求逆!),而在那个时代,几乎没有人会使用牛顿法。于是,聪明的数学家就发明这种共轭梯度方法(CG),CG的特点就是:

  • 不需要完整的将A矩阵的逆( A − 1 A^{-1} A1)表达出来。
  • 而需要的只是:能够衡量A和一个向量的点乘(evaluate A*x)。

现在的时代,我们的计算机已经非常非常强大了,100x100的系统对我们来说非常非常小,几个毫秒就可以求解完。最初提出CG所想要解决的问题已经不存在了,不过CG可以解决我们遇到的其他问题:

计算机内存不足的问题(因为不需要真正存储整个A矩阵或者A的逆)

  • 有一些情况下,A可能不能直接给到我们(比如处于公司保密等情况),但是他们能提供Ax的结果。这种情况下,CG也是很合适的。(当然,我们可以通过Ae,分别点乘所有的基单位向量恢复原本的A)
  • A可能具有特殊结构的情况,比如我们下面将看到的例子(A是一个块矩阵和一个稀疏矩阵的和 A = A b l k + A s p A = A_{blk}+A_{sp} A=Ablk+Asp)这种情况下我们有 A x = A b l k x + A s p x Ax = A_{blk}x+A_{sp}x Ax=A
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
解释:def conjugate_gradient(fun, grad, x0, iterations, tol): """ Minimization of scalar function of one or more variables using the conjugate gradient algorithm. Parameters ---------- fun : function Objective function. grad : function Gradient function of objective function. x0 : numpy.array, size=9 Initial value of the parameters to be estimated. iterations : int Maximum iterations of optimization algorithms. tol : float Tolerance of optimization algorithms. Returns ------- xk : numpy.array, size=9 Parameters wstimated by optimization algorithms. fval : float Objective function value at xk. grad_val : float Gradient value of objective function at xk. grad_log : numpy.array The record of gradient of objective function of each iteration. """ fval = None grad_val = None x_log = [] y_log = [] grad_log = [] x0 = asarray(x0).flatten() # iterations = len(x0) * 200 old_fval = fun(x0) gfk = grad(x0) k = 0 xk = x0 # Sets the initial step guess to dx ~ 1 old_old_fval = old_fval + np.linalg.norm(gfk) / 2 pk = -gfk x_log = np.append(x_log, xk.T) y_log = np.append(y_log, fun(xk)) grad_log = np.append(grad_log, np.linalg.norm(xk - x_log[-1:])) gnorm = np.amax(np.abs(gfk)) sigma_3 = 0.01 while (gnorm > tol) and (k < iterations): deltak = np.dot(gfk, gfk) cached_step = [None] def polak_ribiere_powell_step(alpha, gfkp1=None): xkp1 = xk + alpha * pk if gfkp1 is None: gfkp1 = grad(xkp1) yk = gfkp1 - gfk beta_k = max(0, np.dot(yk, gfkp1) / deltak) pkp1 = -gfkp1 + beta_k * pk gnorm = np.amax(np.abs(gfkp1)) return (alpha, xkp1, pkp1, gfkp1, gnorm) def descent_condition(alpha, xkp1, fp1, gfkp1): # Polak-Ribiere+ needs an explicit check of a sufficient # descent condition, which is not guaranteed by strong Wolfe. # # See Gilbert & Nocedal, "Global convergence properties of # conjugate gradient methods for optimization", # SIAM J. Optimization 2, 21 (1992). cached_step[:] = polak_ribiere_powell_step(alpha, gfkp1) alpha, xk, pk, gfk, gnorm = cached_step # Accept step if it leads to convergence. if gnorm <= tol: return True # Accept step if sufficient descent condition applies. return np.dot(pk, gfk) <= -sigma_3 * np.dot(gfk, gfk) try: alpha_k, fc, gc, old_fval, old_old_fval, gfkp1 = \ _line_search_wolfe12(fun, grad, xk, pk, gfk, old_fval, old_old_fval, c2=0.4, amin=1e-100, amax=1e100, extra_condition=descent_condition) except _LineSearchError: break # Reuse already computed results if possible if alpha_k == cached_step[0]: alpha_k, xk, pk, gfk, gnorm = cached_step else: alpha_k, xk, pk, gfk, gnorm = polak_ribiere_powell_step(alpha_k, gfkp1) k += 1 grad_log = np.append(grad_log, np.linalg.norm(xk - x_log[-1:])) x_log = np.append(x_log, xk.T) y_log = np.append(y_log, fun(xk)) fval = old_fval grad_val = grad_log[-1] return xk, fval, grad_val, x_log, y_log, grad_log
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值