参数寻优问题详细解析

来源:互联网 发布:注册域名多少钱 编辑:程序博客网 时间:2024/05/18 01:46

参数寻优

参数寻优背景

  参数寻优问题随处可见,举几个例子。 
  1. 小明假期结束回校,可以坐火车,可以坐汽车,可以坐飞机,还可以走着,小明从哪条路去学校更好呢? 
  2. 简单的数学,一元二次方程求根。 
  3. 高深的数学,七桥问题,怎么才能通过所有的桥各自一次走回七点所在的岸边。 
  4. 机器学习中,求代价函数在约束条件下的最优解问题。 
  其上四个问题,均是参数寻优问题。问题1中,小明可以通过试探法将所有的方式计算一下时间成本,经济成本,舒适程度,来选择一个性价比最合适的返校方式。问题2中,可以通过一元二次方程的求根公式直接求出解来。问题3中,七桥问题则是典型的图论问题,通过抽象为图,推理得出该题无解。问题4中,机器学习则是数值分析中方程的迭代解法

本文目标

  本文主要讲清楚梯度下降法、牛顿下降法是如何想到并引入参数寻优中的,以及他们为什么有效。

参数寻优的迭代法的基本原理

  

图1 一维的二阶代价函数展示

  
图1 一维的二阶代价函数展示

  
图2 二维的二阶代价函数展示

  
图2 二维的二阶代价函数展示

  通过代价函数的形状,我们很自然地想到,如果我们从任意一个参数点出发,是否可以找到刚好是让代价下降的方向,沿着这个方向,一定能找到当前的极值点。 
  于是,迭代法参数寻优的基本原理有了:沿着(代价)函数下降的方向寻找参数,能够找到极值点。

梯度下降法的引入

  在我们已经学过的数学知识中,导数和方向导数是能找到函数变化方向的。导数表示了曲线的斜率(倾斜度),方向导数表示了曲面沿着任意方向的斜率(倾斜度)。一维时,导数就足够了。但多维时,就需要借助方向导数了,而我们更希望能找到变化率最大的方向因此,多维下借用方向导数变化最大的情况:梯度,梯度的方向是函数某点增长最快的方向,梯度的大小是该点的最大变化率。 
  三维下,推导方向导数与梯度的关系 
  方向导数: 
  

fl=fxcos(α)+fycos(β)+fzcos(γ)

  方向l=(cos(α),cos(β),cos(γ)) 
  梯度Grad=(fx,fx,fx) 
  fl=Gradl 
  fl=|Grad|1cos(Grad,l) 
  当两者方向相同时,cos(Grad,l)=1fl取得最大值|Grad|。因此,梯度表示了函数增长最快的方向,和最大的增长率。

牛顿下降法的引入

牛顿法求解f(x)=0

  在讲牛顿下降法之前,先讲一下f(x)=0的求解f(x)x0处进行一阶泰勒展开: 
  

图 3,牛顿法求解$f(x)=0$

  
图 3,牛顿法求解f(x)=0

  f(x)=f(x0)+f(x0)1!(xx0) 
  则得到f(x0)+f(x0)(xx0)=0 
  解得x=x0f(x0)f(x0)=x1 
  从图中可以看出,x1x0更靠近真实解。如果接下来在x1处一阶泰勒展开,会得到更靠近真实解的x2,以此类推: 
  xn+1=xnf(xn)f(xn) 
  牛顿法具有天然的迭代性,可以不断逼近真实解。

牛顿下降法

  那么牛顿下降法是如何引入的呢?求解最优解minx[Cost(x)]等价于 找到x满足f(x)=0。对于f(x)=0的求解,就可以用上面的牛顿法来不断逼近真实解了。 
  对f(x)x0处一阶泰勒展开。 
  f(x)=f(x0)+(xx0)f′′(x0) 
  令f(x)=0 
  得x=x0f(x0)f′′(x0)=x1 
  xn+1=xnf(xn)f′′(xn)

牛顿下降法的几何意义

  一阶导数决定的函数当前是否增减,二阶则决定这当时是否凹凸。牛顿下降法用二次曲面去拟合当前所处位置的局部曲面,下降方向上的选择不仅考虑了坡度是否足够大,而且考虑了走了这一步之后,坡度是否会变得更大。所以,牛顿下降法比梯度下降法看得更远,能更快地走到局部的最底部。

牛顿下降法的局限性

  (1)收敛性对初始点的选取依赖性很大; 
  (2)每次迭代都要计算Hessian矩阵(二阶导数),计算量大; 
  (3)要求二阶可微分,计算Dk时,方程组有时非正定或者病态,无法求解Dk或者Dk不是下降方向。

阻尼牛顿法的引入

  对牛顿法局限性的不同改进,导致阻尼牛顿法和拟牛顿法的出现。 
  针对牛顿法,有时得到的牛顿方向不是下降的情况,提出了阻尼牛顿法。上升的情况,比如f(x)<0,f′′(x)<0。 
  解决方法是:在新的迭代之前,找到下降方向,且是下降最大的方向。 
  (1)先确定最优解的所在区间[a, b]。 
  (2)一维搜索。在解区间[a, b]内搜索使得目标函数下降最大的点。 
  其中(1)可以用进退法,找到三个点,使得f(ah),f(a),f(a+h)满足大小大的规律即可。 
  一维搜索方法主要分为试探法和插值法,试探法有黄金分割法、fibonacci法、平分法、格点法等;插值法有牛顿法、抛物线法等。判断解两边值的大小关系或者求导为0。 
  剩下的部分就是跟牛顿下降法一样了。(具体实现看前面的博客)

拟牛顿法的引入

  针对牛顿下降法hessian矩阵计算量大,需要正定矩阵的局限性,提出了拟牛顿法,拟牛顿法的核心是对Hessian矩阵的逆的估计。 
  根据不同的估计方法,分为DFP和BFGS。 
  

DFP

  
图 4 DFP

  
BFGS

  
图 5 BFGS


机器学习的一个重要组成部分是如何寻找最优参数解。本文就常见寻优方法进行总结,并给出简单python2.7实现,可能文章有点长,大家耐心些。 
  寻找最优参数解,就是在一块参数区域上,去找到满足约束条件的那组参数。形象描述,比如代价函数是个碗状的,那我们就是去找最底部(代价最小)的那个地方的对应的参数值作为最优解。那么,如何找到那个底部的最优参数解呢,如何由一个初始值,一步一步地接近该最优解呢。寻优方法,提供了靠近最优解的方法,其中涉及到的核心点,无外乎两点:靠近最优解的方向步幅(每步的长度)。 
  最优化,分为线性最优化理论和非线性最优化理论。其中线性最优化又称线性规划。目标函数和约束条件的表达是线性的,Y=aX;非线性最优化理论,是非线性的。其中包括梯度法,牛顿法,拟牛顿法(DFP/BFGS),约束变尺度(SQP),Lagrange乘子法,信赖域法等。

算法原理及简单推导

最速下降法(梯度下降法)

  借助梯度,找到下降最快的方向,大小为最大变化率。 
  θnew=θoldαGradient 
  梯度:是方向导数中,变化最大的那个方向导数。 
  梯度方向:标量场中增长最快的方向。 
  梯度大小:最大变化率。 
  更新:沿着梯度的负向,更新参数(靠近最优解)。 
  ********************************************* 
  Algorithm:GradientDescent 
  Input:xData;yLabel;α;θ0;Iternum; 
  Output:θoptimal 
  Process: 
    1. Initial θ=θ0 
    2. While Loop<Iternum 
      H=f(x,θ);H 
      Compute Gradient According to f(x,θ) 
      Update θ:=θαGradient 
      Loop=Loop+1 
    3. Return θ 
  ********************************************* 
  梯度下降法 
  优点:方便直观,便于理解。 
  缺点:下降速度慢,有时参数会震荡在最优解附近无法终止。

牛顿下降法

  牛顿下降法,是通过泰勒展开到二阶,推到出参数更新公式的。 
  f(x+Δ(x))f(x)+f(x)Δ(x)+12f′′(x)Δ2(x) 
  上式等价于 f(x)+f′′(x)Δ=0 
  从而得到更新公式: 
   xnewxold=f(x)f′′(x)=[f′′(x)]1f(x) 
  调整了参数更新的方向和大小(牛顿方向)。 
  ********************************************* 
  Algorithm:Newton Descent 
  Input:xData;ylabel;θ0;ϵ; 
  Ouput:θoptimal 
  Process: 
    1. Initial θ=θ0 
    2. Compute f(x,θ) 
      if|f(x),θ)|ϵ 
        return θoptimal=θ 
      else 
        Compute H=f′′(x,θ) 
        Dk=[H]1f(x,θ) 
        Update θ:=θ+Dk 
    3. Return step 2 
  ********************************************* 
  牛顿下降法 
  优点:对于正定二次函数,迭代一次,就可以得到极小值点。下降的目的性更强。 
  缺点:要求二阶可微分;收敛性对初始点的选取依赖性很大;每次迭代都要计算Hessian矩阵,计算量大;计算Dk时,方程组有时奇异或者病态,无法求解Dk或者Dk不是下降方向。

阻尼牛顿法

  这是对牛顿法的改进,在求新的迭代点时,以Dk作为搜索方向,进行一维搜索,求步长控制量α,使得α=argminθ[f(θ+αDk)]找到f下降的α且是f下降最大的α,然后令θ=θ+αDk克服了牛顿法的奇异和病态方程无解,Dk非下降的缺点。 
  ********************************************* 
  Algorithm:Damped Newton Descent 
  Input:xData;ylabel;θ0;ϵ 
  Output:θoptimal 
  Process: 
    1. Initial θ=θ0 
    2. Compute f(x,θ) 
      if|f(x,θ)|ϵ 
        Return θoptimal=θ 
      else 
        Compute H=f′′(x,θ) 
        Dk=[H]1f(x,θ) 
        Compute α According to: 
        α=argminθ[f(θ+αDk)] 
        Update θ:=θ+αDk 
    3. Return step 2 
  ********************************************* 
  阻尼牛顿法 
  优点:修改了下降方向,使得始终朝着下降的方向迭代。 
  缺点:与牛顿法一样。

一维搜索方法简介

  一维无约束优化问题minF(α),求解F(α)的极小值和极大值的数值迭代方法,即为一维搜索方法。常用的方法包括:试探法(黄金分割法,fibonacci方法,平分法,格点法);插值法(牛顿法,抛物线法)。 
  (1)确定最优解所在区间[a,b] (进退法) 
  思想:从初始点α0开始,以步长h前进或者后退,试出三个点f(α0+h),f(α0),f(α0h)满足大,小,大规律。 
  ********************************************* 
  Process: 
    1. Initial α1=α0;α2=α0+h; 
         f1=f(α1;f2=f(α2) 
    2. if f1>f2 
      forward,h=2h 
     else 
       backward,h=h; 
       swqp(α1,α2); 
       swap(f1,f2); 
    3. Getthe third point, α3=α2+h;f3=f(α3) 
      if f3>f2 
        a=min(α1,α3) 
        b=max(α1,α3) 
        Return [a,b] 
      if f3<f2 :move the point 
        α1=α2;f1=f2; 
        α2=α3;f2=f3; 
    4. Return step 2 
  ********************************************* 
  (2)在[a, b]内,找到极小值(黄金分割法和平分法) 
  ********************************************* 
  Process: 
    1. Initial check point 
      α1=a+0.382(ba); 
      α2=a+0.618(ba); 
      f1=f(α1); 
      f2=f(α2); 
    2. Change the edge 
     if f1>f2 
      a=α1;b=b; 
     else 
      a=a;b=α2 
    3. Stop condation 
      if |ab|ϵ 
        Return α=(b+a)/2 
      else 
        Return step 1 
  Process: 
    1. Initial check point 
      α=(b+a)/2 
    2. Compute gradient f=f(α) 
      if f=0,or |f|<ϵ 
        Return α 
      if f>0 a=a;b=α; 
      if f<0 a=α;b=b; 
      Return step 1 
  ********************************************* 
  思考:如何在实际应用中,选择[a, b],函数f是什么样子的?这些问题需要讨论。整个优化的目标是:找到最优θ,使得代价CostJ最小。故此f=CostJ

拟牛顿法 - DFP法

  由于牛顿法计算二阶导数,计算量大,故此用其他方法(一阶导数估计Hessian矩阵的逆f(x)Xk+1处,展开成二阶泰勒级数。 
  f(x)f(xk+1)+f(xk+1)(xxk+1)+12f′′(xk+1)(xxk+1)2 
  f(x)f(xk+1)f(xk+1)(xxk+1)+f′′(xk+1)(xxk+1)2 
  两侧同时除以xxk+1则得到: 
  f(x)=f(xk+1)+f′′(xk+1)(xxk+1) 
  f(xk+1)f(xk)f′′(xk+1)(xk+1x) 
  令sk=xk+1xk;yk=f(xk+1)f(xk); 
  则yk=f′′(xk+1)sk 
  且sk=[f′′(xk+1)]1yk 
  用上式来估计Hessian的逆。设H=[f′′(xk+1)]1 
  根据H的构造函数不同,分为不同的拟牛顿方法,下面为DFP方法: 
  Hk+1=Hk+DH 
  DH=skskskykHkykykHkykHkyk 
  ********************************************* 
  Algorithm:DFP QuasiNewton Method 
  Input:xData;yLabel;θ0;ϵ 
  Output:θoptimal 
  Process: 
    1. Initial paraments 
      θ=θ0; H=I; Dk=f(xk,θ) 
    2. if |f(xk,θ)|ϵ 
      Returnθoptimal=θ 
     else 
      Compute α according to: 
      α=argminθ[f(θ+αDk)] 
      Update θ:=θ+αDk 
      Update H as follow: 
       sk=θk+1θk 
       yk=f(xk+1)f(xk) 
      DH=skskskykHykykHykHyk 
      H:=H+DH 
      Dk=Hf(xk,θ) 
    3. Return step 2 
  ********************************************* 
  拟牛顿法DFP: 
  优点:减少了二阶计算,运算量大大降低。 
  

拟牛顿法 - BFGS法

  若构造函数如下,则为BFGS法。 
  Hk+1=Hk+DH 
  DH=[1+ykHkykskyk]skskskykskykHkskyk 
  ********************************************* 
  Algorithm: BFGS QuasiNewton Method 
  Input:xData;yLabel;θ0;ϵ 
  Output:θoptimal 
  Process: 
    1. Initial paraments 
      θ=θ0;H=I;Dk=f(xk,θ); 
    2. if |f(xk,θ)|ϵ 
      Return θoptimal=θ 
     else 
      Compute α according to: 
      α=argminα[f(θ+αDk)] 
      Update θ:=θ+αDk 
      Update H as follow: 
       sk=θk+1θk 
       yk=f(xk+1)f(xk) 
       DH=[1+ykHykskyk]skskskykskykHskyk 
       H:=H+DH 
       Dk=Hf(xk,θ) 
    3. Return step 2 
  ********************************************* 
  拟牛顿法是无约束最优化方法中最有效的一类算法。

算法的Python实现代码

  Python2.7需要安装pandas, numpy, scipy, matplotlib。 
  下面给出Windows7下exe方式按照上面模块的简单方法。 
  numpy–http://sourceforge.net/projects/numpy/files/ –这里面也可以找到较新的scipy – 
scipy–http://download.csdn.net/detail/caanyee/8241305 
pandas-https://pypi.python.org/packages/2.7/p/pandas/pandas-0.12.0.win32-py2.7.exe#md5=80b0b9b891842ef4bdf451ac07b368e5 
  test.py

<code class="hljs python has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># coding = utf-8</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'''time: 2015.06.03author: yujianminobjection: BGD / SGD / mini-batch GD / QNGD / DFP / BFGS 实现了批量梯度下降、单个梯度下降; 最速下降法、牛顿下降法、阻尼牛顿法、拟牛顿DFP和BFGS'''</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> pandas <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> pd<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> numpy <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> np<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> scipy <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> sp<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> matplotlib.pyplot <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> pltdata = pd.read_csv(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"C:\\Users\\yujianmin\\Desktop\\python\\arraydataR.csv"</span>)print(data.ix[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :])dataArray = np.array(data)<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'''x = dataArray[:, 0]y = dataArray[:, 1]plt.plot(x, y, 'o')plt.title('data is like this')plt.xlabel('x feature')plt.ylabel('y label')plt.show()'''</span><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_BGD</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Batch Gradient Descent    :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        H = np.dot(x,theta)        J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)        print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))        costJ.append(J)        Gradient = (np.dot(np.transpose(y-H),x))/nRow        Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<= eplise:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span>            theta = theta + alpha * Gradient        i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_SGD</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Stochastic Gradient Descent    :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    Loop = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop <numIter:        H = np.dot(x,theta)        J = np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)        print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(Loop+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))        costJ.append(J)        i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i <nRow:            Gradient = (y[i] - np.dot(x[i], theta)) * x[i]            Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            theta = theta + alpha * Gradient            i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>        Gradient = (np.dot(np.transpose(y-H),x))/nRow        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<= eplise:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        Loop = Loop + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_NGD1</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Newton Gradient Descent -- theta := theta - alpha*[f'']^(-1)*f'    :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://www.doc88.com/p-145660070193.html    :hessian = transpos(x) * x     '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        H = np.dot(x,theta)        J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span>        print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))        costJ.append(J)        Gradient = (np.dot(np.transpose(y-H),x))/nRow        Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<=eplise:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        Hessian = np.dot(np.transpose(x), x)/nRow        theta = theta + alpha * np.dot(np.linalg.inv(Hessian), Gradient)        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = theta + np.dot(np.linalg.inv(Hessian), Gradient)</span>        i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_NGD2</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Newton Gradient Descent -- theta := theta - [f'']^(-1)*f'    :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://www.doc88.com/p-145660070193.html    :hessian = transpos(x) * x     '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        H = np.dot(x,theta)        J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span>        print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))        costJ.append(J)        Gradient = (np.dot(np.transpose(y-H),x))/nRow        Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient)) <= eplise:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        Hessian = np.dot(np.transpose(x), x)/nRow        theta = theta + np.dot(np.linalg.inv(Hessian), Gradient)        i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_QNGD</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' Newton Gradient Descent -- theta := theta - alpha* [f'']^(-1)*f'--            alpha is search by ForwardAndBack method and huang jin fen ge     :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://www.doc88.com/p-145660070193.html    :hessian = transpos(x) * x     '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        H = np.dot(x,theta)        J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update</span>        print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))        costJ.append(J)        Gradient = (np.dot(np.transpose(y-H),x))/nRow        Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.sum(np.fabs(Gradient))<= eplise:            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:            Hessian = np.dot(np.transpose(x), x)/nRow            Dk = - np.dot(np.linalg.inv(Hessian), Gradient)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optimal [a,b] which contain optimal alpha</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## optimal alpha lead to min{f(theta + alpha*DK)}</span>            alpha0 = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            h = np.random.random(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            alpha1 = alpha0            alpha2 = alpha0 + h            theta1 = theta + alpha1 * Dk            theta2 = theta + alpha2 * Dk            f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            Loop = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>            a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:                print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' find [a,b] loop is %d'</span> %Loop)                Loop = Loop + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2:                    h = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*h                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:                    h = -h                    (alpha1, alpha2) = (alpha2, alpha1)                    (f1, f2) = (f2, f1)                alpha3 = alpha2 + h                theta3 = theta + alpha3 * Dk                f3 = (np.sum((y-np.dot(x, theta3))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)                print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'f3 - f2 is %f'</span> %(f3-f2))                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 > f2:                    a = min(alpha1, alpha3)                    b = max(alpha1, alpha3)                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 <= f2:                    alpha1 = alpha2                    alpha2 = alpha3                    f1 = f2                     f2 = f3            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optiaml alpha in [a,b] using huang jin fen ge fa </span>            e = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.01</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:                alpha1 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.382</span> * (b - a)                alpha2 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.618</span> * (b - a)                theta1 = theta + alpha1* Dk                theta2 = theta + alpha2* Dk                f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)                f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2:                    a = alpha1                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1< f2:                    b = alpha2                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.fabs(a-b) <= e:                    alpha = (a+b)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>            print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'optimal alpha is %f'</span> % alpha)            theta = theta + alpha * Dk        i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_DFP2</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' DFP -- theta := theta + alpha * Dk               --alpha is searched by huangjin method               --satisfied argmin{f(theta+alpha*Dk)}##    :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://blog.pfan.cn/miaowei/52925.html    :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ##    :hessian is estimated by DFP method.    '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    H = np.dot(x,theta)    J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span>    Gradient = (np.dot(np.transpose(y-H),x))/nRow    Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    Dk = - Gradient    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min f(thetaK + alpha * Dk)</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optimal [a,b] which contain optimal alpha</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## optimal alpha lead to min{f(theta + alpha*DK)}</span>            alpha0 = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            h = np.random.random(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            alpha1 = alpha0            alpha2 = alpha0 + h            theta1 = theta + alpha1 * Dk            theta2 = theta + alpha2 * Dk            f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            Loop = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>            a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:                print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' find [a,b] loop is %d'</span> %Loop)                Loop = Loop + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2:                    h = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*h                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:                    h = -h                    (alpha1, alpha2) = (alpha2, alpha1)                    (f1, f2) = (f2, f1)                alpha3 = alpha2 + h                theta3 = theta + alpha3 * Dk                f3 = (np.sum((y-np.dot(x, theta3))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)                print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'f3 - f2 is %f'</span> %(f3-f2))                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 > f2:                    a = min(alpha1, alpha3)                    b = max(alpha1, alpha3)                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f3 <= f2:                    alpha1 = alpha2                    alpha2 = alpha3                    f1 = f2                     f2 = f3            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optiaml alpha in [a,b] using huang jin fen ge fa </span>            e = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.01</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> Loop ><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:                alpha1 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.382</span> * (b - a)                alpha2 = a + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.618</span> * (b - a)                theta1 = theta + alpha1* Dk                theta2 = theta + alpha2* Dk                f1 = (np.sum((y-np.dot(x, theta1))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)                f2 = (np.sum((y-np.dot(x, theta2))**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1 > f2:                    a = alpha1                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> f1< f2:                    b = alpha2                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> np.fabs(a-b) <= e:                    alpha = (a+b)/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>            print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'optimal alpha is %f'</span> % alpha)            theta_old = theta            theta = theta + alpha * Dk            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span>            H = np.dot(x,theta)            J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span>            print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))            costJ.append(J)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian'inv #</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span>            sk = theta - theta_old            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span>            DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow            DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow            yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = (sk * sk') # a matrix</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span>            z1 = sk * np.transpose(sk)            z2 = np.dot(np.transpose(sk),yk)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = (H * yk * yk' * H) # a matrix</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = (yk' * H * yk) # a value</span>            z3 = np.dot(np.dot(np.dot(Hessian, yk), np.transpose(yk)), Hessian)            z4 = np.dot(np.dot(np.transpose(yk), Hessian),yk)            DHessian = z1/z2 - z3/z4            Hessian = Hessian + DHessian            Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>))        i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_DFP1</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' DFP -- theta := theta + alpha * Dk               alpha is fixed ##    :type data: array     :param data: contain x and y(label)     :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://blog.pfan.cn/miaowei/52925.html    :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ##    :hessian is estimated by DFP method.    '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    H = np.dot(x,theta)    J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span>    Gradient = (np.dot(np.transpose(y-H),x))/nRow    Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    Dk = - Gradient    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min f(thetaK + alpha * Dk)</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## here for simple alpha is parameter 'alpha'</span>            alpha = alpha            theta_old = theta            theta = theta + alpha * Dk            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span>            H = np.dot(x,theta)            J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span>            print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))            costJ.append(J)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian'inv #</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span>            sk = theta - theta_old            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span>            DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow            DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow            yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = (sk * sk') # a matrix</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span>            z1 = sk * np.transpose(sk)            z2 = np.dot(np.transpose(sk),yk)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = (H * yk * yk' * H) # a matrix</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = (yk' * H * yk) # a value</span>            z3 = np.dot(np.dot(np.dot(Hessian, yk), np.transpose(yk)), Hessian)            z4 = np.dot(np.dot(np.transpose(yk), Hessian),yk)            DHessian = z1/z2 - z3/z4            Hessian = Hessian + DHessian            Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>))            i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_BFGS1</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' BFGS     :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://blog.pfan.cn/miaowei/52925.html    :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ##    :hessian is estimated by BFGS method.    '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    H = np.dot(x,theta)    J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span>    Gradient = (np.dot(np.transpose(y-H),x))/nRow    Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    Dk = - Gradient    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min J(thetaK + alpha * Dk)</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## here for simple alpha is parameter 'alpha'</span>            alpha = alpha            theta_old = theta            theta = theta + alpha * Dk            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span>            H = np.dot(x,theta)            J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span>            print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))            costJ.append(J)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian #</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span>            sk = theta - theta_old            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span>            DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow            DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow            yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = yk' * H * yk # a value</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span>            z1 = np.dot(np.dot(np.transpose(yk), Hessian), yk)            z2 = np.dot(np.transpose(sk),yk)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = sk * sk' # a matrix</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = sk * yk' * H # a matrix</span>            z3 = np.dot(sk, np.transpose(sk))            z4 = np.dot(np.dot(sk, np.transpose(yk)), Hessian)            DHessian = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>+z1/z2) * (z3/z2) - z4/z2            Hessian = Hessian + DHessian            Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>))            i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">Myfunction_BFGS2</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(data, alpha, numIter, eplise)</span>:</span>    <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''' BFGS     :type data: array      :param data: contain x and y(label)    :type step: int/float numeric    :param step: length of step when update the theta    :reference:http://blog.pfan.cn/miaowei/52925.html    :reference:http://max.book118.com/html/2012/1025/3119007.shtm ## important ##    :hessian is estimated by BFGS method.    '''</span>    nCol = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    nRow = data.shape[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nCol    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> nRow    x = data[:, :nCol]    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> x[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>, :]    z = np.ones(nRow).reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    x = np.hstack((z, x))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## vstack merge like rbind in R; hstack like cbind in R;</span>    y = data[:, (nCol)].reshape(nRow, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta = np.random.random(nCol+1).reshape(nCol+1, 1)</span>    theta = np.ones(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>    costJ = []    Hessian = np.eye(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    H = np.dot(x,theta)    J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#costJ.append(J)</span>    Gradient = (np.dot(np.transpose(y-H),x))/nRow    Gradient = Gradient.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)    Dk = - Gradient    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#eplise = 0.4</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < numIter:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(np.sum(np.fabs(Dk)) <= eplise ): <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## stop condition ##</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find alpha that min J(thetaK + alpha * Dk)</span>            alpha = alpha            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## find optimal [a,b] which contain optimal alpha</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## optimal alpha lead to min{f(theta + alpha*DK)}</span>            <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'''            alpha0 = 0            h = np.random.random(1)            alpha1 = alpha0            alpha2 = alpha0 + h            theta1 = theta + alpha1 * Dk            theta2 = theta + alpha2 * Dk            f1 = (np.sum((y-np.dot(x, theta1))**2))/(2*nRow)            f2 = (np.sum((y-np.dot(x, theta2))**2))/(2*nRow)            Loop = 1            a = 0            b = 0            while Loop >0:                print(' find [a,b] loop is %d' %Loop)                Loop = Loop + 1                if f1 > f2:                    h = 2*h                else:                    h = -h                    (alpha1, alpha2) = (alpha2, alpha1)                    (f1, f2) = (f2, f1)                alpha3 = alpha2 + h                theta3 = theta + alpha3 * Dk                f3 = (np.sum((y-np.dot(x, theta3))**2))/(2*nRow)                print('f3 - f2 is %f' %(f3-f2))                if f3 > f2:                    a = min(alpha1, alpha3)                    b = max(alpha1, alpha3)                    break                if f3 <= f2:                    alpha1 = alpha2                    alpha2 = alpha3                    f1 = f2                     f2 = f3            ## find optiaml alpha in [a,b] using huang jin fen ge fa             e = 0.01            while Loop >0:                alpha1 = a + 0.382 * (b - a)                alpha2 = a + 0.618 * (b - a)                theta1 = theta + alpha1* Dk                theta2 = theta + alpha2* Dk                f1 = (np.sum((y-np.dot(x, theta1))**2))/(2*nRow)                f2 = (np.sum((y-np.dot(x, theta2))**2))/(2*nRow)                if f1 > f2:                    a = alpha1                if f1< f2:                    b = alpha2                if np.fabs(a-b) <= e:                    alpha = (a+b)/2                    break            print('optimal alpha is %f' % alpha)            '''</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## Get Dk and update Hessian</span>            theta_old = theta            theta = theta + alpha * Dk            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update the Hessian matrix ##</span>            H = np.dot(x,theta)            J = (np.sum((y-H)**<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>))/(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*nRow)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## update </span>            print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Itering %d ;cost is:%f'</span> %(i+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,J))            costJ.append(J)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># here to estimate Hessian #</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># sk = ThetaNew - ThetaOld = alpha * inv(H) * Gradient</span>            sk = theta - theta_old            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#yk = DelX(k+1) - DelX(k)</span>            DelXK = - (np.dot(np.transpose(y-np.dot(x, theta)),x))/nRow            DelXk = - (np.dot(np.transpose(y-np.dot(x, theta_old)),x))/nRow            yk = (DelXK - DelXk).reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z1 = yk' * H * yk # a value</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z2 = (sk' * yk) # a value</span>            z1 = np.dot(np.dot(np.transpose(yk), Hessian), yk)            z2 = np.dot(np.transpose(sk),yk)            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z3 = sk * sk' # a matrix</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#z4 = sk * yk' * H # a matrix</span>            z3 = np.dot(sk, np.transpose(sk))            z4 = np.dot(np.dot(sk, np.transpose(yk)), Hessian)            DHessian = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>+z1/z2) * (z3/z2) - z4/z2            Hessian = Hessian + DHessian            Dk = - np.dot(Hessian, DelXK.reshape(nCol+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>))            i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> theta, costJ<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## test ##</span>num = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10000</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_BGD(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_SGD(dataArray, alpha=0.00005, numIter=num, eplise=0.4)</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_NGD1(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is fixed ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_NGD2(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is 1 ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_QNGD(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is searched ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_DFP1(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is fixed ##</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#theta, costJ = Myfunction_DFP2(dataArray, alpha=0.0005, numIter=num, eplise=0.4) ## alpha is searched ##</span>theta, costJ = Myfunction_BFGS1(dataArray, alpha=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.0005</span>, numIter=num, eplise=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.4</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">## alpha is fxied ##</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">print</span> thetaklen = len(costJ)leng = np.linspace(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, klen, klen)plt.plot(leng, costJ)plt.show()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li><li style="box-sizing: border-box; padding: 0px 5px;">351</li><li style="box-sizing: border-box; padding: 0px 5px;">352</li><li style="box-sizing: border-box; padding: 0px 5px;">353</li><li style="box-sizing: border-box; padding: 0px 5px;">354</li><li style="box-sizing: border-box; padding: 0px 5px;">355</li><li style="box-sizing: border-box; padding: 0px 5px;">356</li><li style="box-sizing: border-box; padding: 0px 5px;">357</li><li style="box-sizing: border-box; padding: 0px 5px;">358</li><li style="box-sizing: border-box; padding: 0px 5px;">359</li><li style="box-sizing: border-box; padding: 0px 5px;">360</li><li style="box-sizing: border-box; padding: 0px 5px;">361</li><li style="box-sizing: border-box; padding: 0px 5px;">362</li><li style="box-sizing: border-box; padding: 0px 5px;">363</li><li style="box-sizing: border-box; padding: 0px 5px;">364</li><li style="box-sizing: border-box; padding: 0px 5px;">365</li><li style="box-sizing: border-box; padding: 0px 5px;">366</li><li style="box-sizing: border-box; padding: 0px 5px;">367</li><li style="box-sizing: border-box; padding: 0px 5px;">368</li><li style="box-sizing: border-box; padding: 0px 5px;">369</li><li style="box-sizing: border-box; padding: 0px 5px;">370</li><li style="box-sizing: border-box; padding: 0px 5px;">371</li><li style="box-sizing: border-box; padding: 0px 5px;">372</li><li style="box-sizing: border-box; padding: 0px 5px;">373</li><li style="box-sizing: border-box; padding: 0px 5px;">374</li><li style="box-sizing: border-box; padding: 0px 5px;">375</li><li style="box-sizing: border-box; padding: 0px 5px;">376</li><li style="box-sizing: border-box; padding: 0px 5px;">377</li><li style="box-sizing: border-box; padding: 0px 5px;">378</li><li style="box-sizing: border-box; padding: 0px 5px;">379</li><li style="box-sizing: border-box; padding: 0px 5px;">380</li><li style="box-sizing: border-box; padding: 0px 5px;">381</li><li style="box-sizing: border-box; padding: 0px 5px;">382</li><li style="box-sizing: border-box; padding: 0px 5px;">383</li><li style="box-sizing: border-box; padding: 0px 5px;">384</li><li style="box-sizing: border-box; padding: 0px 5px;">385</li><li style="box-sizing: border-box; padding: 0px 5px;">386</li><li style="box-sizing: border-box; padding: 0px 5px;">387</li><li style="box-sizing: border-box; padding: 0px 5px;">388</li><li style="box-sizing: border-box; padding: 0px 5px;">389</li><li style="box-sizing: border-box; padding: 0px 5px;">390</li><li style="box-sizing: border-box; padding: 0px 5px;">391</li><li style="box-sizing: border-box; padding: 0px 5px;">392</li><li style="box-sizing: border-box; padding: 0px 5px;">393</li><li style="box-sizing: border-box; padding: 0px 5px;">394</li><li style="box-sizing: border-box; padding: 0px 5px;">395</li><li style="box-sizing: border-box; padding: 0px 5px;">396</li><li style="box-sizing: border-box; padding: 0px 5px;">397</li><li style="box-sizing: border-box; padding: 0px 5px;">398</li><li style="box-sizing: border-box; padding: 0px 5px;">399</li><li style="box-sizing: border-box; padding: 0px 5px;">400</li><li style="box-sizing: border-box; padding: 0px 5px;">401</li><li style="box-sizing: border-box; padding: 0px 5px;">402</li><li style="box-sizing: border-box; padding: 0px 5px;">403</li><li style="box-sizing: border-box; padding: 0px 5px;">404</li><li style="box-sizing: border-box; padding: 0px 5px;">405</li><li style="box-sizing: border-box; padding: 0px 5px;">406</li><li style="box-sizing: border-box; padding: 0px 5px;">407</li><li style="box-sizing: border-box; padding: 0px 5px;">408</li><li style="box-sizing: border-box; padding: 0px 5px;">409</li><li style="box-sizing: border-box; padding: 0px 5px;">410</li><li style="box-sizing: border-box; padding: 0px 5px;">411</li><li style="box-sizing: border-box; padding: 0px 5px;">412</li><li style="box-sizing: border-box; padding: 0px 5px;">413</li><li style="box-sizing: border-box; padding: 0px 5px;">414</li><li style="box-sizing: border-box; padding: 0px 5px;">415</li><li style="box-sizing: border-box; padding: 0px 5px;">416</li><li style="box-sizing: border-box; padding: 0px 5px;">417</li><li style="box-sizing: border-box; padding: 0px 5px;">418</li><li style="box-sizing: border-box; padding: 0px 5px;">419</li><li style="box-sizing: border-box; padding: 0px 5px;">420</li><li style="box-sizing: border-box; padding: 0px 5px;">421</li><li style="box-sizing: border-box; padding: 0px 5px;">422</li><li style="box-sizing: border-box; padding: 0px 5px;">423</li><li style="box-sizing: border-box; padding: 0px 5px;">424</li><li style="box-sizing: border-box; padding: 0px 5px;">425</li><li style="box-sizing: border-box; padding: 0px 5px;">426</li><li style="box-sizing: border-box; padding: 0px 5px;">427</li><li style="box-sizing: border-box; padding: 0px 5px;">428</li><li style="box-sizing: border-box; padding: 0px 5px;">429</li><li style="box-sizing: border-box; padding: 0px 5px;">430</li><li style="box-sizing: border-box; padding: 0px 5px;">431</li><li style="box-sizing: border-box; padding: 0px 5px;">432</li><li style="box-sizing: border-box; padding: 0px 5px;">433</li><li style="box-sizing: border-box; padding: 0px 5px;">434</li><li style="box-sizing: border-box; padding: 0px 5px;">435</li><li style="box-sizing: border-box; padding: 0px 5px;">436</li><li style="box-sizing: border-box; padding: 0px 5px;">437</li><li style="box-sizing: border-box; padding: 0px 5px;">438</li><li style="box-sizing: border-box; padding: 0px 5px;">439</li><li style="box-sizing: border-box; padding: 0px 5px;">440</li><li style="box-sizing: border-box; padding: 0px 5px;">441</li><li style="box-sizing: border-box; padding: 0px 5px;">442</li><li style="box-sizing: border-box; padding: 0px 5px;">443</li><li style="box-sizing: border-box; padding: 0px 5px;">444</li><li style="box-sizing: border-box; padding: 0px 5px;">445</li><li style="box-sizing: border-box; padding: 0px 5px;">446</li><li style="box-sizing: border-box; padding: 0px 5px;">447</li><li style="box-sizing: border-box; padding: 0px 5px;">448</li><li style="box-sizing: border-box; padding: 0px 5px;">449</li><li style="box-sizing: border-box; padding: 0px 5px;">450</li><li style="box-sizing: border-box; padding: 0px 5px;">451</li><li style="box-sizing: border-box; padding: 0px 5px;">452</li><li style="box-sizing: border-box; padding: 0px 5px;">453</li><li style="box-sizing: border-box; padding: 0px 5px;">454</li><li style="box-sizing: border-box; padding: 0px 5px;">455</li><li style="box-sizing: border-box; padding: 0px 5px;">456</li><li style="box-sizing: border-box; padding: 0px 5px;">457</li><li style="box-sizing: border-box; padding: 0px 5px;">458</li><li style="box-sizing: border-box; padding: 0px 5px;">459</li><li style="box-sizing: border-box; padding: 0px 5px;">460</li><li style="box-sizing: border-box; padding: 0px 5px;">461</li><li style="box-sizing: border-box; padding: 0px 5px;">462</li><li style="box-sizing: border-box; padding: 0px 5px;">463</li><li style="box-sizing: border-box; padding: 0px 5px;">464</li><li style="box-sizing: border-box; padding: 0px 5px;">465</li><li style="box-sizing: border-box; padding: 0px 5px;">466</li><li style="box-sizing: border-box; padding: 0px 5px;">467</li><li style="box-sizing: border-box; padding: 0px 5px;">468</li><li style="box-sizing: border-box; padding: 0px 5px;">469</li><li style="box-sizing: border-box; padding: 0px 5px;">470</li><li style="box-sizing: border-box; padding: 0px 5px;">471</li><li style="box-sizing: border-box; padding: 0px 5px;">472</li><li style="box-sizing: border-box; padding: 0px 5px;">473</li><li style="box-sizing: border-box; padding: 0px 5px;">474</li><li style="box-sizing: border-box; padding: 0px 5px;">475</li><li style="box-sizing: border-box; padding: 0px 5px;">476</li><li style="box-sizing: border-box; padding: 0px 5px;">477</li><li style="box-sizing: border-box; padding: 0px 5px;">478</li><li style="box-sizing: border-box; padding: 0px 5px;">479</li><li style="box-sizing: border-box; padding: 0px 5px;">480</li><li style="box-sizing: border-box; padding: 0px 5px;">481</li><li style="box-sizing: border-box; padding: 0px 5px;">482</li><li style="box-sizing: border-box; padding: 0px 5px;">483</li><li style="box-sizing: border-box; padding: 0px 5px;">484</li><li style="box-sizing: border-box; padding: 0px 5px;">485</li><li style="box-sizing: border-box; padding: 0px 5px;">486</li><li style="box-sizing: border-box; padding: 0px 5px;">487</li><li style="box-sizing: border-box; padding: 0px 5px;">488</li><li style="box-sizing: border-box; padding: 0px 5px;">489</li><li style="box-sizing: border-box; padding: 0px 5px;">490</li><li style="box-sizing: border-box; padding: 0px 5px;">491</li><li style="box-sizing: border-box; padding: 0px 5px;">492</li><li style="box-sizing: border-box; padding: 0px 5px;">493</li><li style="box-sizing: border-box; padding: 0px 5px;">494</li><li style="box-sizing: border-box; padding: 0px 5px;">495</li><li style="box-sizing: border-box; padding: 0px 5px;">496</li><li style="box-sizing: border-box; padding: 0px 5px;">497</li><li style="box-sizing: border-box; padding: 0px 5px;">498</li><li style="box-sizing: border-box; padding: 0px 5px;">499</li><li style="box-sizing: border-box; padding: 0px 5px;">500</li><li style="box-sizing: border-box; padding: 0px 5px;">501</li><li style="box-sizing: border-box; padding: 0px 5px;">502</li><li style="box-sizing: border-box; padding: 0px 5px;">503</li><li style="box-sizing: border-box; padding: 0px 5px;">504</li><li style="box-sizing: border-box; padding: 0px 5px;">505</li><li style="box-sizing: border-box; padding: 0px 5px;">506</li><li style="box-sizing: border-box; padding: 0px 5px;">507</li><li style="box-sizing: border-box; padding: 0px 5px;">508</li><li style="box-sizing: border-box; padding: 0px 5px;">509</li><li style="box-sizing: border-box; padding: 0px 5px;">510</li><li style="box-sizing: border-box; padding: 0px 5px;">511</li><li style="box-sizing: border-box; padding: 0px 5px;">512</li><li style="box-sizing: border-box; padding: 0px 5px;">513</li><li style="box-sizing: border-box; padding: 0px 5px;">514</li><li style="box-sizing: border-box; padding: 0px 5px;">515</li><li style="box-sizing: border-box; padding: 0px 5px;">516</li><li style="box-sizing: border-box; padding: 0px 5px;">517</li><li style="box-sizing: border-box; padding: 0px 5px;">518</li><li style="box-sizing: border-box; padding: 0px 5px;">519</li><li style="box-sizing: border-box; padding: 0px 5px;">520</li><li style="box-sizing: border-box; padding: 0px 5px;">521</li><li style="box-sizing: border-box; padding: 0px 5px;">522</li><li style="box-sizing: border-box; padding: 0px 5px;">523</li><li style="box-sizing: border-box; padding: 0px 5px;">524</li><li style="box-sizing: border-box; padding: 0px 5px;">525</li><li style="box-sizing: border-box; padding: 0px 5px;">526</li><li style="box-sizing: border-box; padding: 0px 5px;">527</li><li style="box-sizing: border-box; padding: 0px 5px;">528</li><li style="box-sizing: border-box; padding: 0px 5px;">529</li><li style="box-sizing: border-box; padding: 0px 5px;">530</li><li style="box-sizing: border-box; padding: 0px 5px;">531</li><li style="box-sizing: border-box; padding: 0px 5px;">532</li><li style="box-sizing: border-box; padding: 0px 5px;">533</li><li style="box-sizing: border-box; padding: 0px 5px;">534</li><li style="box-sizing: border-box; padding: 0px 5px;">535</li><li style="box-sizing: border-box; padding: 0px 5px;">536</li><li style="box-sizing: border-box; padding: 0px 5px;">537</li><li style="box-sizing: border-box; padding: 0px 5px;">538</li><li style="box-sizing: border-box; padding: 0px 5px;">539</li><li style="box-sizing: border-box; padding: 0px 5px;">540</li><li style="box-sizing: border-box; padding: 0px 5px;">541</li><li style="box-sizing: border-box; padding: 0px 5px;">542</li><li style="box-sizing: border-box; padding: 0px 5px;">543</li><li style="box-sizing: border-box; padding: 0px 5px;">544</li><li style="box-sizing: border-box; padding: 0px 5px;">545</li><li style="box-sizing: border-box; padding: 0px 5px;">546</li><li style="box-sizing: border-box; padding: 0px 5px;">547</li><li style="box-sizing: border-box; padding: 0px 5px;">548</li><li style="box-sizing: border-box; padding: 0px 5px;">549</li><li style="box-sizing: border-box; padding: 0px 5px;">550</li><li style="box-sizing: border-box; padding: 0px 5px;">551</li><li style="box-sizing: border-box; padding: 0px 5px;">552</li><li style="box-sizing: border-box; padding: 0px 5px;">553</li><li style="box-sizing: border-box; padding: 0px 5px;">554</li><li style="box-sizing: border-box; padding: 0px 5px;">555</li><li style="box-sizing: border-box; padding: 0px 5px;">556</li><li style="box-sizing: border-box; padding: 0px 5px;">557</li><li style="box-sizing: border-box; padding: 0px 5px;">558</li><li style="box-sizing: border-box; padding: 0px 5px;">559</li><li style="box-sizing: border-box; padding: 0px 5px;">560</li><li style="box-sizing: border-box; padding: 0px 5px;">561</li><li style="box-sizing: border-box; padding: 0px 5px;">562</li><li style="box-sizing: border-box; padding: 0px 5px;">563</li><li style="box-sizing: border-box; padding: 0px 5px;">564</li><li style="box-sizing: border-box; padding: 0px 5px;">565</li><li style="box-sizing: border-box; padding: 0px 5px;">566</li><li style="box-sizing: border-box; padding: 0px 5px;">567</li><li style="box-sizing: border-box; padding: 0px 5px;">568</li><li style="box-sizing: border-box; padding: 0px 5px;">569</li><li style="box-sizing: border-box; padding: 0px 5px;">570</li><li style="box-sizing: border-box; padding: 0px 5px;">571</li><li style="box-sizing: border-box; padding: 0px 5px;">572</li><li style="box-sizing: border-box; padding: 0px 5px;">573</li><li style="box-sizing: border-box; padding: 0px 5px;">574</li><li style="box-sizing: border-box; padding: 0px 5px;">575</li><li style="box-sizing: border-box; padding: 0px 5px;">576</li><li style="box-sizing: border-box; padding: 0px 5px;">577</li><li style="box-sizing: border-box; padding: 0px 5px;">578</li><li style="box-sizing: border-box; padding: 0px 5px;">579</li><li style="box-sizing: border-box; padding: 0px 5px;">580</li><li style="box-sizing: border-box; padding: 0px 5px;">581</li><li style="box-sizing: border-box; padding: 0px 5px;">582</li><li style="box-sizing: border-box; padding: 0px 5px;">583</li><li style="box-sizing: border-box; padding: 0px 5px;">584</li><li style="box-sizing: border-box; padding: 0px 5px;">585</li><li style="box-sizing: border-box; padding: 0px 5px;">586</li><li style="box-sizing: border-box; padding: 0px 5px;">587</li><li style="box-sizing: border-box; padding: 0px 5px;">588</li><li style="box-sizing: border-box; padding: 0px 5px;">589</li><li style="box-sizing: border-box; padding: 0px 5px;">590</li><li style="box-sizing: border-box; padding: 0px 5px;">591</li><li style="box-sizing: border-box; padding: 0px 5px;">592</li><li style="box-sizing: border-box; padding: 0px 5px;">593</li><li style="box-sizing: border-box; padding: 0px 5px;">594</li><li style="box-sizing: border-box; padding: 0px 5px;">595</li><li style="box-sizing: border-box; padding: 0px 5px;">596</li><li style="box-sizing: border-box; padding: 0px 5px;">597</li><li style="box-sizing: border-box; padding: 0px 5px;">598</li><li style="box-sizing: border-box; padding: 0px 5px;">599</li><li style="box-sizing: border-box; padding: 0px 5px;">600</li><li style="box-sizing: border-box; padding: 0px 5px;">601</li><li style="box-sizing: border-box; padding: 0px 5px;">602</li><li style="box-sizing: border-box; padding: 0px 5px;">603</li><li style="box-sizing: border-box; padding: 0px 5px;">604</li><li style="box-sizing: border-box; padding: 0px 5px;">605</li><li style="box-sizing: border-box; padding: 0px 5px;">606</li><li style="box-sizing: border-box; padding: 0px 5px;">607</li><li style="box-sizing: border-box; padding: 0px 5px;">608</li><li style="box-sizing: border-box; padding: 0px 5px;">609</li><li style="box-sizing: border-box; padding: 0px 5px;">610</li><li style="box-sizing: border-box; padding: 0px 5px;">611</li><li style="box-sizing: border-box; padding: 0px 5px;">612</li><li style="box-sizing: border-box; padding: 0px 5px;">613</li><li style="box-sizing: border-box; padding: 0px 5px;">614</li><li style="box-sizing: border-box; padding: 0px 5px;">615</li><li style="box-sizing: border-box; padding: 0px 5px;">616</li><li style="box-sizing: border-box; padding: 0px 5px;">617</li><li style="box-sizing: border-box; padding: 0px 5px;">618</li><li style="box-sizing: border-box; padding: 0px 5px;">619</li><li style="box-sizing: border-box; padding: 0px 5px;">620</li><li style="box-sizing: border-box; padding: 0px 5px;">621</li><li style="box-sizing: border-box; padding: 0px 5px;">622</li><li style="box-sizing: border-box; padding: 0px 5px;">623</li><li style="box-sizing: border-box; padding: 0px 5px;">624</li><li style="box-sizing: border-box; padding: 0px 5px;">625</li><li style="box-sizing: border-box; padding: 0px 5px;">626</li><li style="box-sizing: border-box; padding: 0px 5px;">627</li><li style="box-sizing: border-box; padding: 0px 5px;">628</li><li style="box-sizing: border-box; padding: 0px 5px;">629</li><li style="box-sizing: border-box; padding: 0px 5px;">630</li><li style="box-sizing: border-box; padding: 0px 5px;">631</li><li style="box-sizing: border-box; padding: 0px 5px;">632</li><li style="box-sizing: border-box; padding: 0px 5px;">633</li><li style="box-sizing: border-box; padding: 0px 5px;">634</li><li style="box-sizing: border-box; padding: 0px 5px;">635</li><li style="box-sizing: border-box; padding: 0px 5px;">636</li><li style="box-sizing: border-box; padding: 0px 5px;">637</li><li style="box-sizing: border-box; padding: 0px 5px;">638</li><li style="box-sizing: border-box; padding: 0px 5px;">639</li><li style="box-sizing: border-box; padding: 0px 5px;">640</li><li style="box-sizing: border-box; padding: 0px 5px;">641</li><li style="box-sizing: border-box; padding: 0px 5px;">642</li><li style="box-sizing: border-box; padding: 0px 5px;">643</li><li style="box-sizing: border-box; padding: 0px 5px;">644</li><li style="box-sizing: border-box; padding: 0px 5px;">645</li><li style="box-sizing: border-box; padding: 0px 5px;">646</li><li style="box-sizing: border-box; padding: 0px 5px;">647</li><li style="box-sizing: border-box; padding: 0px 5px;">648</li><li style="box-sizing: border-box; padding: 0px 5px;">649</li><li style="box-sizing: border-box; padding: 0px 5px;">650</li><li style="box-sizing: border-box; padding: 0px 5px;">651</li><li style="box-sizing: border-box; padding: 0px 5px;">652</li><li style="box-sizing: border-box; padding: 0px 5px;">653</li><li style="box-sizing: border-box; padding: 0px 5px;">654</li><li style="box-sizing: border-box; padding: 0px 5px;">655</li><li style="box-sizing: border-box; padding: 0px 5px;">656</li><li style="box-sizing: border-box; padding: 0px 5px;">657</li><li style="box-sizing: border-box; padding: 0px 5px;">658</li><li style="box-sizing: border-box; padding: 0px 5px;">659</li><li style="box-sizing: border-box; padding: 0px 5px;">660</li><li style="box-sizing: border-box; padding: 0px 5px;">661</li><li style="box-sizing: border-box; padding: 0px 5px;">662</li><li style="box-sizing: border-box; padding: 0px 5px;">663</li><li style="box-sizing: border-box; padding: 0px 5px;">664</li><li style="box-sizing: border-box; padding: 0px 5px;">665</li><li style="box-sizing: border-box; padding: 0px 5px;">666</li><li style="box-sizing: border-box; padding: 0px 5px;">667</li></ul>

实验数据和结果展示

数据csv格式

<code class="hljs  has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">0   28.224016691   33.249216932   35.820842773   36.870968784   30.984885315   38.782212966   38.467533247   41.960658458   36.826564139   35.508112110  35.7464718111  36.1711098712  37.5116599913  41.2710925714  44.0384267715  48.0300170516  45.5040184317  45.0263560818  51.7057403419  46.7635988120  52.648759521  48.8138359322  50.6945125423  55.5420040324  54.5563958625  53.1903622326  58.8926909127  54.7888425128  57.903395129  62.2111496730  64.5102546831  62.2071053732  62.9473630433  60.3044793334  65.3204440635  65.8290345236  66.3787221637  69.7564055338  66.0211259439  65.8711903940  74.2720975141  67.5766162842  73.1944408843  69.453311744  74.9112981745  71.2118760946  77.096254547  81.9506683748  78.0463683849  83.4284252650  80.4021756351  78.6865020652  82.9139521553  85.0966311554  88.7154090755  87.7395556  89.1865477657  91.0933744158  83.9561442259  93.3068317960  93.2761859661  88.0785923862  89.1066785663  95.6144366664  93.3989910665  94.3825875866  96.8764180267  96.8789694668  97.009441269  100.07611570  104.761990571  100.791709372  99.8552336273  106.901849474  103.606106375  103.410505876  106.430457677  110.735724978  107.042045579  107.283422180  113.929949681  111.218762782  116.410059683  108.023725684  112.777359285  117.346495786  117.197680787  120.053852188  114.458496489  122.2860022</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li></ul>

结果展示

横轴是迭代次数,纵轴是代价 


Batch Gradient Descent

Batch Gradient Descent- 批量梯度下降法


Stochastic Gradient Descent

Stochastic Gradient Descent- 随机梯度下降法


Newton固定alpha=1

Newton下降法,固定alpha=1


Newton固定alpha=0.0005

Newton下降法,固定alpha=0.0005


DFP,alpha是自适应的

DFP,alpha是一维搜索得到的


阻尼牛顿法,alpha是自适应的

阻尼牛顿法,alpha是一维搜索得到的

总结

  不管什么最优化方法,都是试图去寻找代价下降最快的方向和合适的步幅。



前面介绍了参数寻优的传统方法,梯度下降,牛顿下降等,传统的参数寻优方法,都是提供了下降的方向和大小参考。如果参数非常多,成千上万个参数,很多峰谷时,有没有较好的方法去估计最优解呢。本文介绍的方法就是在没有下降参考的情况下,如何去估计最优解,其中包括遗传算法,粒子群算法,蚁群算法,都是仿生物学算法。

启发式搜索

  启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置搜索直到目标。由部分信息对计算产生推理,个体能够基于经验或者个体经验交流改变搜索方式。不同于穷举搜索(网格法)和随机搜索(模拟退火算法)。

遗传算法

  遗传算法(GA)的思想来自于进化论,生物种群具有自我进化的能力,能够不断适应环境,优势劣汰之后得到最优的种群个体。进化的行为主要有选择,遗传,变异,遗传算法希望能够通过将初始解空间进化到一个较好的解空间。 
  遗传算法的大体步骤: 
  1. 初始化候选参数集,并编码为基因序列{ 初始化种群,一组参数编码为一个种群个体,共M个种群个体 }。设定进化代数T。 
  2. 个体评估,计算各个种群个体的适应度{ 适应度描述了该个体对自然环境的适应能力,表征了其个体存活能力和生殖机会}。 
  3. 选择运算,选择是模拟自然选择,把优秀的个体选择出来{基于适应度},以进行后续的遗传和变异。 
  4. 交叉运算,交叉是模拟繁殖后代的基因重组。 
  5. 变异运算,变异是模拟基因突变。 
  6. 经过选择,交叉,变异,生产下一代群体,重复此过程,直到停止条件。 
  适应度函数的设计要求(由目标函数而来): 
  1. 单值,连续,非负,最大化; 
  2. 合理,一致性; 
  3. 计算量小。 
  将目标函数,或者线性变化Fitness(x)=αF(x)+β,或者幂函数变换Fitness(x)=F(x)k,或者指数变换Fitness(x)=eαF(x),或者Goldbery线性拉伸变换Fitness(x)=(Cmult1)FavgFmaxFavgF(x)+FmaxCmultFavgFmaxFavgFavg,或者Fitness(x)=nmF(x),m=1+lnT,n, 
  遗传算法的优缺点: 
  1. 通用性强,且简单易于理解。 
  2. 潜在的并行性。 
  3. 参数选择经验居多。 
  4. 搜索速度慢。

粒子群算法

  粒子群算法(Particle Swarm Optimization, PSO),是在研究复杂适应系统(Complex Adaptive System, CAS)-鸟群觅食的过程中提出的。 
  CAS系统的主体(系统成员)具有4个基本特点:(这些特点是粒子群算法发展变化的依据) 
  1. 主体是主动的,活动的。 
  2. 主体与环境及其他主体是相互影响、相互作用的,这种影响是系统发展变化的主要动力。 
  3. 环境的影响是宏观的,主体之间的影响是微观的,宏观与微观要有机结合。 
  4. 整个系统可能还要受一些随机因素的影响。 
  鸟群觅食场景:一群鸟随机地找食物,只有一小片区域是有食物的。每个鸟在自己周边蹦跳,然后叫几声,跟同伴交流食物情况。有个鸟说“哎,我这里有吃的”,然后其他鸟都朝着它所在的方向飞,中间停下来再找。重复上面的过程,最后鸟儿都会集中到有食物的地方。其搜索策略是所有参数都向着当前最优参数的区域搜索(搜索目前离食物最近的鸟的周围区域)。 
  粒子群算法的大体步骤: 
  1. 初始化参数集θi=(θi,1,θi,2,...,θi,n),初始速度Vi,权重C1,C2 
  2. 分别搜索各个参数附近的局部最优解pbest,选择历史最好的局部最优解作为当前的全局最优解gbest。 
  3. 更新速度: 
  Vk+1=WVk+C1rand()(pbestθ)+C2rand()(gbestθ) 
   更新位置(参数):θk+1=θk+rVk+1 
  4. 判断终止条件,不符合则否则重复2,3,4步骤。 
  其中W是惯性权重,表示保持原来速度的惯性。 
  C1是跟踪自己历史最优值的权重系数,表示对自身的认识。 
  C2是跟踪群体最优的权重系数,表示对整个群体的认识。 
  rand()是[0,1]内均匀分布的随机数,表示系统受到的随机影响。 
  r是速度的约束系数。 
  粒子群算法的优缺点: 
  1. 算法规则简单,容易实现。 
  2. 收敛速度快,有很多措施避免陷入局部最优。 
  3. 可调参数少,参数选择有理论支持(Eberhart-A modified particle swarm optimizer)。

蚁群算法

  蚁群算法(ACO)是一种模拟蚂蚁觅食行为的模拟优化算法,其基本思想是:当蚂蚁沿着一条路径到达终点以后会马上返回来,这样,短的路径蚂蚁往返一次的时间就短,意味着重复频率快,因而在单位时间内走过的蚂蚁数量就多,洒下的信息素也就多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素;而长路径则相反,因此最后越来越多的蚂蚁集中到了较短的路径上,最短路径也就近似找到了。 
  信息素:蚂蚁留在路径上用于间接交流的物质,可挥发,。信息素多的地方显然经过的蚂蚁多,也会吸引更多的蚂蚁过来。 
  正反馈:在某一路径走过的蚂蚁越多,信息素越多,蚂蚁选择该路径的概率越大。 
  例子:由蚁群算法解决TSP(Traveling Salesman Problem)问题。TSP问题,在多个城市中,找到访问完所有城市的最短路径。设C=c1,c2,...cnn个城市的集合;L=lij|ci,cjCC中元素两两连接的集合,代表城市之间的路径;dij表示城市ci,cj之间的距离。G=(C,L)是一个结构图。 
  蚂蚁系统中的人工蚂蚁特点: 
  1. 蚂蚁依据某一概率函数选择下一步要到的城市,该概率函数是城市间距离dij和边上的信息素τij(t)的函数。τij(t)表示t时刻在边lij上的信息素。 
  2. 每只蚂蚁只允许走合法路径(除非是一次周游,返回起点),不允许走已经访问过的城市。该过程由禁忌表tabuk来控制,蚂蚁k经过城市ci后,将其加入到禁忌表中,下次走时不能走禁忌表中的城市。tabuk(s)表示蚂蚁所走过的第s个城市。 
  3. 完成一次周游后,蚂蚁在其访问过的每一条边上留下相应的信息素。 
  蚁群算法解决TSP问题的大体步骤: 
  1. 初始化 
   1.1 位置初始化,将m只蚂蚁随机地放到n个城市每只蚂蚁的禁忌表的第一个元素设置为其当前所在城市。 
   1.2 信息素初始化,信息素量设为τij(0)=。 
  2. 路径查找 
   2.1 下一步路径查找,根据概率pkij(t)计算下一步城市,概率pkij(t)表示t时刻,蚂蚁k从城市ci转移到城市cj的概率。 
  

pkij(t)=[τij(t)]α[ηij(t)]βsJk(i)[τis(t)]α[ηis(t)]β0jJk(i)jJk(i)
   
   其中Jk(i)=[1,2,3,...,n]tabuk表示蚂蚁k下一步允许选择的城市。当所有n个城市都在禁忌表中后,则蚂蚁k完成了一次周游,其所走过的路径tabuk是一个可行解。ηij=1/dij表示蚂蚁从城市ci转移到城市cj的期望程度。αβ分别分别表示信息素和其的相对重要程度。 
   2.2 所有蚂蚁查找完一次周游路径。 
  3. 更新信息素 
  
τij(t+1)=(1ρ)τij(t)+Δτij

  
Δτij=mk=1Δτkij

  
Δτkij={QLk0klij

   其中,ρ(0<ρ<1)表示边上信息素的蒸发系数,1ρ表示信息素的持久系数。Δτkij表示第k只蚂蚁在本次迭代中留在边lij上的信息素。Q为正常数,Lk表示第k只蚂蚁在本次周游中所经过的路径的长度。 
  4. 是否符合终止条件(迭代次数),若不满足,则清空禁忌表(保留第一个值),保留信息素。返回第2步。 
   
  Δτkij的另外几种形式。 
  Δτkij=Qdij0klij 
  Δτkij={Q0klij 
  包括上面那种,分别称为antcycle;antquantity;antdensity.信息素与目标函数息息相关,其中Δτij表征了代价的大小。 
  蚁群算法的优缺点: 
  1. 蚁群算法是一种自组织算法,基于简单规则(多样性和正反馈规则,前者表现创造力,后者是学习强化能力)。 
  2. 并行性。 
  3. 正反馈,引导系统向着最优解方向进化。 
  4. 对初始路线要求不高。 
  5. 参数初始选择原则暂无理论支持。 
  6. 搜索时间较长。 
  7. 会陷入局部解,停滞现象。 
  http://blog.163.com/ykn_2010/blog/static/1420333362012111411258466/ 一个蚁群算法的介绍博客。 
  http://www.ailab.cn/algorithm/ant/201110015765.html 蚁群算法的一些文献资源。

免疫算法

  免疫算法是改进了遗传算法的退化问题,因为遗传算法的交叉和变异算子是固定的。

小结

  仿生学。 
  应用广泛。 
  初始集为解集合,而不是单个解。 
  复杂系统,由简单规则支配。 

2 0
原创粉丝点击