本系列文章允许转载,转载请保留全文!

【请先阅读】【说明&总目录】http://www.cnblogs.com/tbcaaa8/p/4415055.html

1. 用牛顿法解方程

牛顿法是一种求解方程的迭代算法,也可以用于方程组的求解。其思想是利用方程(尤其是非线性方程)的线性部分,对原方程进行近似。不失一般性,考虑方程f(x)=0。对f(x)在x=t处进行泰勒展开,可得f(x)=f(t)+f'(t)(x-t)+...

取线性部分代替f(x),带入方程f(x)=0,可得f(t)+f'(t)(x-t)=0 ,进而解出x=t-f(t)/f'(t)。将方程的解写为迭代形式,可以得到牛顿法的迭代公式:

[例]使用牛顿法解方程x3+x=2

第一步:求f(x)及f'(x),即f(x)=x3+x-2, f'(x)=3x2+1

第二步:选择迭代初始值。初始值一般应选在解的附近,以防算法不收敛。这里选择x(0)=2

第三步:根据迭代公式和初始值迭代求解。迭代过程如下:

k x(k) f(x(k))
0 2.00 8.00
1 1.38 2.04
2 1.08 0.35
3 1.00 0.02
4 1.00 0.00

结论:经过4次迭代后,函数取值变为0,即原方程的根已找到。

牛顿法的收敛条件及收敛速度的分析略去。在机器学习的应用中,可以采用尝试不同初始值的方法减少不收敛现象的发生;若牛顿法收敛,一般可以达到二阶收敛的收敛速度,与梯度下降法相比,迭代次数明显减少。

2. 用牛顿法解方程组

在本系列上一篇文章中,我们使用梯度下降法求解损失函数J的极小值;而从上面的描述来看,牛顿迭代只是用来求解方程的根,这与多元函数的极小值又有什么联系呢?其实,要求多元函数的极小值,只需令多元函数对每一个自变量的偏导数为0,并解出此时每一个自变量的取值即可。于是,多元函数极小值问题,被转化为多元非线性方程组求解问题。

首先考虑多元函数的泰勒展开。不失一般性,以f1(x1,x2,...,xn)为例,在点(t1,t2,...,tn)的泰勒展开式如下:

取线性部分代替f1(x),并令其为0,有:

将其整理为向量形式,并分离出自变量,可以得到:( 为了简便,以下使用f1代替f1(t1,t2,...,tn) )

假定方程组由一系列方程{f1=0, f2=0, ..., fn=0}组成,可以将上式整理为矩阵形式:

上式中的n*n矩阵为雅可比矩阵(Jacobian Matrix),简记为J(F)。同时,将自变量(x1,...,xn)记为X,将(t1,...,tn)记为T,将(f1,...,fn)记为F,则有:

化简后可得:

将方程组的解写为迭代形式,即可得到适用于方程组求解的牛顿法迭代公式:

至此可以发现,虽然牛顿法的迭代次数比梯度下降法小得多,但是在每一次迭代过程中,都需要重新计算J(F)的逆矩阵。若n为特征维数,则通常逆矩阵的计算需要Θ(n3)的时间复杂度。使用Strassen方法可以使逆矩阵计算的时间复杂度降至Θ(nlog27),也可以使用数值方法近似求解逆矩阵,但当特征维数较大时,这两种方法仍然很慢。因此,仅在特征维数较小时,牛顿法才能够快速收敛。特殊地,当取n=1时,上式可退化为本文第1节推导出的,用于求解单个方程的牛顿迭代公式。

3. 使用牛顿法求函数的极值

若用▽Xf(X)表示函数f(X)的梯度向量,带入普通牛顿法迭代公式中,即可得到用于求函数极值的迭代公式:

考虑到:

迭代公式可以在形式上进一步化简:

其中,H(f)表示函数f(x1,...,xn)的海森矩阵(Hessian Matrix)。

就具体问题而言,本系列上一篇文章需要求损失函数的极小值。除了之前介绍的梯度下降法之外,还可以使用本文章介绍的牛顿法。对应的迭代公式为:

4. 补充 [2015-05-07]

关于牛顿法,补充一个证明。

相信很多初学者都有这样的疑问:为什么牛顿法会收敛;若牛顿法收敛,为什么能收敛到方程的一组解?

简单起见,以牛顿法的最简单形式x(k+1)=x(k)-f(x(k))/f'(x(k))进行讨论,同时假定x0为方程f(x)的某一单根,且f(x)在x=x0附近二阶连续。不加证明的给出以下定理:(证明可参考数值分析相关教材)

局部收敛定理 设x0是方程x=g(x)的根,若g'(x)在x=x0处连续,且|g'(x0)|<1,则存在x0的某一邻域S,使得对于任意x(0)∈S,迭代格式x(k+1)=g(x(k))收敛于x0

在之前的假设下,对牛顿法收敛性的证明如下:

记g(x)=x-f(x)/f'(x),则有g'(x)=f(x)f''(x)/(f'(x))2,易知g'(x0)=0<1。根据局部收敛定理可知,迭代格式x(k+1)=g(x(k))收敛于x0,即x(k+1)=x(k)-f(x(k))/f'(x(k))收敛于x0

Machine Learning 学习笔记 (2) —— 使用牛顿法寻找极值的更多相关文章

  1. [Machine Learning]学习笔记-Logistic Regression

    [Machine Learning]学习笔记-Logistic Regression 模型-二分类任务 Logistic regression,亦称logtic regression,翻译为" ...

  2. Machine Learning 学习笔记

    点击标题可转到相关博客. 博客专栏:机器学习 PDF 文档下载地址:Machine Learning 学习笔记 机器学习 scikit-learn 图谱 人脸表情识别常用的几个数据库 机器学习 F1- ...

  3. [Python & Machine Learning] 学习笔记之scikit-learn机器学习库

    1. scikit-learn介绍 scikit-learn是Python的一个开源机器学习模块,它建立在NumPy,SciPy和matplotlib模块之上.值得一提的是,scikit-learn最 ...

  4. Machine Learning 学习笔记1 - 基本概念以及各分类

    What is machine learning? 并没有广泛认可的定义来准确定义机器学习.以下定义均为译文,若以后有时间,将补充原英文...... 定义1.来自Arthur Samuel(上世纪50 ...

  5. Coursera 机器学习 第6章(上) Advice for Applying Machine Learning 学习笔记

    这章的内容对于设计分析假设性能有很大的帮助,如果运用的好,将会节省实验者大量时间. Machine Learning System Design6.1 Evaluating a Learning Al ...

  6. machine learning学习笔记

    看到Max Welling教授主页上有不少学习notes,收藏一下吧,其最近出版了一本书呢还,还没看过. http://www.ics.uci.edu/~welling/classnotes/clas ...

  7. [Machine Learning]学习笔记-线性回归

    模型 假定有i组输入输出数据.输入变量可以用\(x^i\)表示,输出变量可以用\(y^i\)表示,一对\(\{x^i,y^i\}\)名为训练样本(training example),它们的集合则名为训 ...

  8. 吴恩达Machine Learning学习笔记(一)

    机器学习的定义 A computer program is said to learn from experience E with respect to some class of tasks T ...

  9. Machine Learning 学习笔记 01 Typora、配置OSS、导论

    Typora 安装与使用. Typora插件. OSS图床配置. 机器学习导论. 机器学习的基本思路. 机器学习实操的7个步骤

随机推荐

  1. Qt中QObject中的parent参数

    今天写了一个小程序,验证了带参的构造函数中参数parent的作用. 在MainWindow中声明一个QDialog类型的指针,在MainWindow中对它进行初始化.我采用了两种初始化方式,一种是带参 ...

  2. Oracle笔记 三、function 、select

    Scott表下有这么几个常用的表,而且还带有数据.分别是emp.dept.salgrade: 1.查看表结构用desc desc emp; 2.空表dual,最常用的空表,如: select 2 * ...

  3. 必须会的SQL语句(三)插入

    1.规范一些使用插入语句的小规范   1)中文字符串前 最好 加一个N   2)列名用中括号 扩起来   像这样  [列名]   2.常规写法 Insert into tableName ( [col ...

  4. 实例分析ELF文件静态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...

  5. 在HTML文件中加载js

    js加载只分为两种: 1.全局js,放在<head>标签里面,整个页面很多都用到的,它是优先加载的. 2.局部js,放在</html>结束标签以内的任何位置,它是第二加载的.

  6. ASP.NET的学习之asp.net整体运行机制

    1.浏览器向服务器发送请求报文,服务器端的软件比如是IIS,接受请求 2.IIS通过aspnet_isapi.dll 这个程序集来请求FrameWork中的ASP.Net框架,这是对于集成模式 3.进 ...

  7. Web前端性能优化的9大问题

    1.请减少HTTP请求基本原理:在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出.一个正常HTTP请求的流程简述:如在浏览器中输入&qu ...

  8. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

  9. 基于zookeeper的远程方法调用(RMI)的实现

    采用zookeeper的命名服务,采用不同的目录结构存储不同模块不同服务的rmi的url,使用key来对应不同的服务.同时采用zookeeper解决了单点问题. 当有两个相同的服务注册时,因为采用的是 ...

  10. PHP错误处理及异常处理笔记

    给新人总结一下PHP的错误处理. PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实 ...