Newton's Method

在求最优解时,前面很多地方都用梯度下降(Gradient Descent)的方法,但由于最优步长很难确定,可能会出现总是在最优解附近徘徊的情况,致使最优解的搜索过程很缓慢。牛顿法(Newton's Method)在最优解的搜索方面有了较大改进,它不仅利用了目标函数的一阶导数,还利用了搜索点处的二阶导数,使得搜索算法能更准确地指向最优解。

我们结合下图所示的一个实例来描述牛顿法的思想。假设我们想要求得参数\theta,使得f(\theta)=0。算法的描述如下:

  1. 随机猜测一个解\theta^{(0)},并令t=0;
  2. 在\theta^{(t)}处用一根切线来近似f(\theta);
  3. 求得切线与横坐标的交点\theta^{(t+1)},作为下一个可能的解;
  4. t=t+1;
  5. 重复2-4,直到收敛,即f(\theta^{(t)})\approx 0。

那么\theta^{(t+1)}与\theta^{(t)}之间存在怎样的迭代关系呢?由切线的斜率可知 \begin{equation} f'(\theta)=\frac{f(\theta)}{\vartriangle}\Rightarrow \vartriangle=\frac{f(\theta)}{f'(\theta)} \end{equation}

观察\theta^{(t+1)}与\theta^{(t)}在横坐标上的关系,可知 \begin{equation} \theta^{(t+1)}=\theta^{(t)}-\vartriangle=\theta^{(t)}-\frac{f(\theta)}{f'(\theta)} \end{equation}

牛顿法给出了f(\theta)=0的求解算法,那么怎样将其运用到求使似然函数\mathcal{L}(\theta)最大化的参数上呢?一般最优参数\theta^{\star}在\mathcal{L}(\theta)的极值点出取得,即\mathcal{L}'(\theta^{\star})=0。那么,令上面的f(\theta)=\mathcal{L}'(\theta),我们很容易就得出了下列的迭代法则 \begin{equation} \theta^{(t+1)}=\theta^{(t)}-\frac{\mathcal{L}'(\theta^{(t)})}{\mathcal{L}''(\theta^{(t)})} \end{equation}

 

最终求得使\mathcal{L}'(\theta)=0的参数\theta^\star,也就是令似然函数\mathcal{L}(\theta)最大的参数。

上面讨论的参数\theta\in\mathbb{R},我们现在将牛顿法则推广到n维向量\theta\in\mathbb{R}^n,对应的迭代法则形式如下:\begin{equation} \theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_{\theta}\mathcal{L} \end{equation}

 

其中H为\mathcal{L}对向量\theta^{(t)}的二阶偏导,称为Hessian矩阵,H_{ij}=\frac{\partial^2\mathcal{L}}{\partial\theta^{(t)}_i\partial\theta^{(t)}_j}。

接下来,我们从另外一个角度来考察牛顿法。用似然函数\mathcal{L}(\theta)的二阶泰勒展开\mathcal{F}(\theta)来对其进行逼近。\begin{equation} \mathcal{L}(\theta)\approx\mathcal{F}(\theta)=\mathcal{L}(\theta^{(t})+\nabla_{\theta^{(t)}}\mathcal{L}(\theta-\theta^{(t)})+\frac{1}{2}(\theta-\theta^{(t)})^TH(\theta-\theta^{(t)}) \end{equation}

 

令\theta=\theta^{(t+1)},可得 \begin{equation} \begin{array}{ll} \mathcal{F}(\theta^{(t+1)})=&\mathcal{L}(\theta^{(t)})+\nabla_{\theta^{(t)}}\mathcal{L}^T(\theta^{(t+1)}-\theta^{(t)})\\ &+\frac{1}{2}(\theta^{(t+1)}-\theta^{(t)})^TH(\theta^{(t+1)}-\theta^{(t)}) \end{array} \end{equation}

 

现在,我们的目的是求得使\mathcal{F}(\theta^{(t+1)})最小的参数\theta^{(t+1)}。将上式对\theta^{(t+1)}求导并令导数为0,可得\begin{equation} \frac{\partial\mathcal{F}(\theta^{(t+1)})}{\partial\theta^{(t+1)}}=\nabla_{\theta^{(t)}}\mathcal{L}+H(\theta^{(t+1)}-\theta^{(t)})=0 \end{equation}

 

等式两侧同时左乘H^{-1},化简得 \begin{equation} \theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_{\theta}\mathcal{L} \end{equation}

 

我们用的是二阶泰勒展开式\mathcal{F}(\theta)逼近似然函数\mathcal{L}(\theta)。如果\mathcal{L}(\theta)确实为二次函数,那么\mathcal{F}(\theta)就是\mathcal{L}(\theta)的准确展开式,利用牛顿法一步就可以直接求得最优解。一般情况下,\mathcal{L}(\theta)并非二次函数,那么\mathcal{F}(\theta)也就存在逼近误差,使得一次迭代不能求得最优解,当\mathcal{L}(\theta)的次数很高时,往往要经历很多次迭代。一般而言,因为牛顿法利用了二阶导数来修正搜索方向和步长,收敛速度很更快。但是这同样也是要付出代价的,相比梯度下降而言,我们需要额外计算Hessian矩阵并求其逆,这两步的计算代价都很大。只要参数\theta的维度n不是很大,可以考虑用牛顿迭代。另外还有一点,如果目标函数不是严格的凸函数,Hessian矩阵H很可能是奇异矩阵,也就是存在特征值为0的情况,那么它的逆矩阵是不存在的,也就无法用牛顿法。

今年有一道面试题是要求我们写出一段程序,求解\sqrt{n}。如果把牛顿法用上去,问题就迎刃而解了。我们设定目标函数为f(x)=x^2-n,那么令f(x)=0的解很显然就是\pm\sqrt{n}。要注意的是,我们要选择合理的迭代起始点,如果我们从正数开始迭代,求得的是\sqrt{n};如果从负数开始迭代,求得的就是-\sqrt{n};如果从0开始迭代,会出现未定义的计算(0作为除数)。我们根据前面讲的牛顿迭代法则,直接给出该题的迭代法则 \begin{equation} x^{(t+1)}=x^{(t)}-\frac{f(x^{(t)})}{f'(x^{(t)})}=x^{(t)}-\frac{(x^{(t)})^2-n}{2x^{(t)}}=\frac{1}{2}\left(x^{(t)}+\frac{n}{x^{(t)}}\right) \end{equation}

 

下面是由该算法写出的一段精简的code,浓缩了牛顿算法的精髓

 1 double mysqrt1(double n)
2 {
3 if (n<0) return -1;
4 if(n==0) return 0;
5 double eps=1e-5;
6 double x=0.1;//start from a positive value
7 while(fabs(x*x-n)>=eps)
8 x=(x+n/x)/2;//Newton's method
9 return x;
10 }

这道题我还想了另外一个算法,算法的启发点来源于(x-1)(x+1)+1=x^2=n。用这个算法,我们的迭代起始点可以是0。算法的基本思想如下:给定一个初始步长step,从起始点开始每次向前走一个步长,直到超过了\sqrt{n};一旦超过了\sqrt{n},就要开始慢慢向最终解靠近,每次前进或后退的步长都缩减为以前的一半。很明显,这个算法没有牛顿迭代法快。我只用了少数几个测试用例,两段程序的计算结果都和sqrt库函数的计算结果一致。代码如下:

 1 //Inspiration comes from the eqution:(x+1)(x-1)+1=x*x
2 //We can search the solution from an initial point x=0 with a step size
3 //and use the equation above to estimate x*x until we approach it close enough
4 double mysqrt2(double n)
5 {
6 if (n<0) return -1;
7 double x=0;
8 double step=10;
9 int threshold=0;
10 double eps=1e-5;
11 double res=(x+1)*(x-1)+1;
12 while(fabs(res-x)>=eps)
13 {
14 if(res<x)
15 {
16 //once we have passed the solution,we must walk forward slowly
17 if(threshold) step/=2;
18 x+=step;//walking forward
19 }
20 else//walk
21 {
22 threshold=1;//indicating we have passed the solution
23 step/=2;//reducing the step size to its half
24 x-=step;//walking back
25 }
26 res=(x+1)*(x-1)+1;//compute x*x to estimate real n
27 }//end while
28 return x;
29 }
 
 

随笔 - 24, 文章 - 8, 评论 - 12, 引用 - 0

[算法][庞果网]倒水问题/量水问题

题目详情

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。
我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。
可以进行的操作是:
把一个容器灌满;
把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。
    问是否能够通过有限次操作,使得水缸最后恰好有C升水。

输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000
输出:0或1,表示能否达到要求。

函数头部:
c语言:1表示可以,0表示不可以
int can(int a,int b,int c);
c++语言: true表示可以,false表示不可以
bool can(int a,int b,int c);
java语言:true表示可以,false表示不可以
public class Main {
    public static boolean can(int a,int b,int c);
}

解题思路

这是一个典型的倒水问题/量水问题,使用欧几里得算法就可解出来。
 
这里有一篇文章给出了简单的倒水问题的解法,可以解决笔试面试里面一些简单的填空题,可以看一看:http://blog.csdn.net/morewindows/article/details/7481851
基本思想是:不断用小桶装水倒入大桶,大桶满了立即清空,每次判断下二个桶中水的容量是否等于指定容量。也就是用小桶容量的倍数对大桶的容量进行取余,直到余数等于指定容量。
例如,用7升的桶和11升的桶得到2升水可以这样做:
7 % 11 = 7
14 % 11 = 3
21 % 11 = 10
28 % 11 = 6
35 % 11 = 2  成功得到2升水。
对于明确说明可以得到xx升水,需要我们给出如何倒出来的步骤,可以用这个方法,很快捷。但是这个方法不适合解这道题。
 
欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。
用gcd(a,b) 表示a, b的最大公约数,则有定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
具体的算法实现有循环和递归两种,我用的是循环的方法。
 
扩展欧几里得算法
定理:对于不完全为 0 的非负整数 a,b,gcd(a, b)表示 a, b 的最大公约数,必然存在整数对 x, y ,使得 gcd(a,b)=ax+by。
 
本题实际上是问是否存在整数x, y,使得ax+by=c成立。如果c可以被gcd(a,b)整除,则成立。
 
因此解题步骤如下:
1. 求出gcd(a,b)
2. 判断c是否能被gcd(a,b)整除,若能则返回true,否则返回false

Java代码

 1 public static boolean can(int a,int b,int c) {
2 int r;
3 while (true) {
4 r = a % b;
5 if (r != 0) {
6 a = b;
7 b = r;
8 } else {
9 break;
10 }
11 }
12 return c%b == 0; //b现在是最大公约数,若c能被b整除,则可以
13 }
 
 
 
标签: 算法

牛顿法(Newton's Method)的更多相关文章

  1. Newton's Method

    在求最优解时,前面很多地方都用梯度下降(Gradient Descent)的方法,但由于最优步长很难确定,可能会出现总是在最优解附近徘徊的情况,致使最优解的搜索过程很缓慢.牛顿法(Newton's M ...

  2. 牛顿方法(Newton's Method)

    在讲义<线性回归.梯度下降>和<逻辑回归>中我们提到可以用梯度下降或梯度上升的方式求解θ.在本文中将讲解另一种求解θ的方法:牛顿方法(Newton's method). 牛顿方 ...

  3. 牛顿迭代法(Newton's Method)

    牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.但是,这一方法在牛顿生前并未公开发表. 牛顿法的作用是使用迭代的方法来求解函数方程的根. ...

  4. Jacobian矩阵、Hessian矩阵和Newton's method

    在寻找极大极小值的过程中,有一个经典的算法叫做Newton's method,在学习Newton's method的过程中,会引入两个矩阵,使得理解的难度增大,下面就对这个问题进行描述. 1, Jac ...

  5. 【cs229-Lecture4】Newton’s method

    之前我们在求Logistic回归时,用的是梯度上升算法,也就是要使得似然函数最大化,利用梯度上升算法,不断的迭代.这节课引出牛顿方法,它的作用和梯度上升算法的一样的,不同的是牛顿方法所需的迭代次数更少 ...

  6. 牛顿迭代法(Newton's Method)

    牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. ...

  7. Logistic Regression and Newton's Method

    Data For this exercise, suppose that a high school has a dataset representing 40 students who were a ...

  8. Newton法(牛顿法 Newton Method)

               1.牛顿法应用范围                          牛顿法主要有两个应用方向:1.目标函数最优化求解.例:已知 f(x)的表达形式,,求 ,及g(x)取最小值时 ...

  9. [MIT6.006] 12. Square Roots, Newton's Method 平方根,牛顿法

    首先让我们回顾下上节课讲的,用牛顿法计算√2的内容: 简单来说,牛顿法从x0=1不断向后计算逼近√2的值,而刚开始计算的精度是1,随着牛顿法的逼近(共log2d个循环),就能使得√2逼近值的精度达到d ...

随机推荐

  1. Android发展的一个重要方面Makefile分析

    Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...

  2. MyEclipse2014 设备 checkstyle、PMD、findbugs 最简单的方法 详细说明

    最近的实验需要的代码审查和应用程序性能优化.在需求MyEclipse安装某些插件,由于如今的MyEclipse版本号和大多数教程的不一样了,一些安装选项也已经改变,所以安装起来非常费事,通过不断的尝试 ...

  3. 【Android工具】DES终结者加密时报——AES加密演算法

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...

  4. java 字符串反转

    描述:给我一个字符串,例如I love java,输出: java love I   方法一 public class StringReverse { public void swap(char[] ...

  5. Android MediaPlayer 和 NativePlayer 播放格式控制

    对于本机MediaPlayer 支持格型式试验: 对于原生 NativeMedia 的支持格式測试: 这个支持就比較失望了,眼下測试的手机仅仅支持 H.264视频及AAC音频,其他的格式都不支持. 使 ...

  6. 教你一步一步部署.net免费空间OpenShift系列之一------帐号注册和验证

    前几天有博友发布了一篇文章<一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了>,支持MVC3和域名绑定,觉得不错,于是自己实践了一下,发现自己实际遇到的问题真 ...

  7. (转)javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法

        在JSP中,页面链接是使用web路径的,但如果JavaBean要访问本地文件读取配置信息的话,是需要文件的本地路径的.如果你在写 Bean的时候直接将本地路径写进去,那网站的路径就不能变化,丧 ...

  8. Java初始阶段

    初时接触感觉Java与C语言有很多异曲同工之处. Java起源: Java之父:James Gosling 正式发布时间:1995年5月23日 其特点为:简单.面向对象.可移植.多线程.动态 其编译后 ...

  9. [Elasticsearch] 分布式文件存储

    本文翻译自Elasticsearch官方指南的distributed document store一章. 分布式文档存储 在上一章中,我们一直在介绍索引数据和获取数据的方法.可是我们省略了非常多关于数 ...

  10. Delphi三层网络架构代码实现

    Delphi三层网络架构代码实现 1 .三层网络的概念 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为: 表现层(UI).业务逻辑层(BLL).数据访 ...