zoukankan      html  css  js  c++  java
  • 凸优化算法之牛顿法

    原理

    对于求方程解问题,假设有函数 f  :R->R,我们希望找到满足 f(θ)=0 θ值. 这里θ是实数. 
    牛顿方法执行下面的更新
    这里写图片描述 
    求解过程如图所示

    简单的来说就是通过求当前点的导数得到下一个点.用到的性质是导数值等于该点切线和横轴夹角的正切值

    利用凸函数的性质,最值所在点 l'(θ)=0  f(θ)=l'(θ)
    这里写图片描述

    牛顿方法的一般化: 
    如果θ是一个向量,那么: 

    这里写图片描述 

    H称为海森矩阵(Hessian matrix),是一个n*n的矩阵,n是特征量的个数,并且这里写图片描述

    牛顿方法的收敛速度比批处理梯度下降快很多,很少次的迭代就能够非常接近最小值了;但是当n很大时,每次迭代求海森矩阵和逆代价是很大的。

    牛顿法是二阶收敛,梯度下降法是一阶收敛的,所以牛顿法看得更远,收敛更快。牛顿法的路径更符合最优路径。对于二阶凸函数能够一步到达。

    实际中常常先用梯度下降法,在离得比较近时使用牛顿法;由于牛顿法需要每次更新海森矩阵,所以使用拟牛顿法。


    举例
    求解问题   f(x1,x2) = -x14 - 2x24 + 2x1x2 + 2x2 + 6
    x1f =-4x13+2x2
    x2f = 2x1-8x23+2
    Hessian = [ -12x12, 2; 2, -24x22]

    迭代次数计数
            {
    [x1 ; x2 ] = [x1 ; x2 ] -Hessian 点乘  [x1f x2f ]
    }
    figure_1-5.png
    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Wed Apr 12 23:56:25 2017
    4. @author: LoveDMR
    5. 牛顿方法
    6. """
    7. import numpy as np
    8. import matplotlib.pyplot as plt
    9. delta = 0.25
    10. x1 = np.arange( -10 , 10 , delta )
    11. x2 = np.arange( -10 , 10 , delta )
    12. X1 , X2 = np.meshgrid( x1 , x2 )
    13. Y = 2*X1*X2+2*X2-X1**4-2*X2**4 + 6
    14. plt.figure()
    15. bg_fig = plt.contour(X1,X2,Y)
    16. theta = np.array([8,8])
    17. a , b = [] , []
    18. a.append(theta[0])
    19. b.append(theta[1])
    20. H = np.array([[2,3],[3,10]])
    21. Hi = np.linalg.inv(H)
    22. for i in xrange(1,50):
    23. t = np.array([theta[0]**3*(-4)+2*theta[1]**2 , (-8)*theta[1]**3+2*theta[0]+2])
    24. H = np.array([[(-12)*theta[0]**3,2],[2,(-24)*theta[1]**2]])
    25. Hi = np.linalg.inv(H)
    26. theta = theta - np.dot( Hi ,t )
    27. a.append(theta[0])
    28. b.append(theta[1])
    29. plt.plot(a , b)
    30. plt.title( "Newton's method" )
    31. plt.xlabel('x1')
    32. plt.ylabel('x2')
    33. plt.show()

  • 相关阅读:
    Android Studio在android Emulator中运行的项目黑屏
    【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
    ASP.NET Core获取请求完整的Url
    解决Cannot find module '@angular/compiler-cli'
    必备三件套:xshell6+xftp6+navicat
    关于bertTokenizer
    关于warm up(transformers.get_linear_schedule_with_warmup)
    一文弄懂pytorch搭建网络流程+多分类评价指标
    python实现多分类评价指标
    如何使用flask将模型部署为服务
  • 原文地址:https://www.cnblogs.com/flyfatty/p/6702906.html
Copyright © 2011-2022 走看看