R语言实现牛顿迭代算法

我们今天给大家介绍一个用来迭代的算法牛顿迭代法(Newton's method)。单变量下又称为切线法。它是一种在实数域和复数域上近似求解方程的方法。首先我们看下牛顿迭代算法的公式:

其中,Xn+1和Xn主要是指的在n+1和n这个位置的X值。

以上公式的推导可以用泰勒展开公式进行推导。当然上面只是一元一阶的情况的,如果更复杂的那就是多元多阶的情况需要用到更复杂的Hessian矩阵获得以上的通用公式模型。

关于推导的部分,我们就不展开了。接下来我们直接用一个R语言的实例来看下,牛顿迭代是如何工作的。我们看下下面这个例题:

以上就是简单的一元函数求解,当然我们基于我们数学的基础也可以人工展开计算,但是当次幂升到很高,那我们就无从下手了,这时候就可以直接通过牛顿迭代进行获取根。我们就基于上面的例子进行程序设计:

funs=function(x){
  f=x
  J=(2*x^3-4*x^2+3*x-6)/(6*x^2-8*x+3)
  list(f=f,J=J);
                            }
                                                
#Newton迭代法
Newtons=function(fun,x,ep=1e-5,it_max=1000){
 index=0;k=1
 while(k<=it_max){
 norm=abs(fun(x)$J)
 x=x-fun(x)$J
       if(norm<ep){ index=1;break}
       k=k+1
      }
   list(root=x,it=k,index=index)
}                                               
Newtons(funs,1)

通过上面的程序计算就得到我们的根:

上面root就是我们得到的根,it指的迭代的次数,index指的最后的结果1代表找到根;0代表没找到根。

上面是一个简单的例子,那么如果多元的函数我们如何去计算它的根呢,那么就需要我们的Hessian矩阵方法帮我们进行一步转化,然后再生成我们想要的函数。接下来看一下实例:

上面这个例子呢,其实是已经帮大家转化好了对应的矩阵方程,一般我们遇到的那可就不这么简单了,可能是上面的一个方程式组,更可能是只有一个函数方程,需要我们进行下一步的转化,一直到最后转化为我们想要的矩阵方程式。然后构建我们的程序(以下程序引自网友PPT):

funs=function(x){
  f=c(x[1]^2+x[2]^2-5,(x[1]+1)*x[2]-(3*x[1]+1));
  J=matrix(c(2*x[1],2*x[2],x[2]-3,x[1]+1),nrow=2,byrow=T);
  list(f=f,J=J);
                            }
 
#Newton迭代法
Newtons=function(fun,x,ep=1e-5,it_max=100){
 index=0;k=1
 while(k<=it_max){
 x1=x;obj=fun(x);x=x-solve(obj$J,obj$f);norm=sqrt((x-x1)%*%(x-x1));
       if(norm<ep){ index=1;break}
       k=k+1
      }
   obj=fun(x)
   list(root=x,it=k,index=index,Funval=obj$f)
}
 
Newtons(funs,c(0,1))

上图结果多了个Funval,也就是对应的根的f(x)的值。由结果可以看出,的确可以迭代到非常接近根的位置。

当然还有其他的迭代算法梯度下降法、拟牛顿法,三者并称是机器学习中最常见的三大类迭代法。

具体在真实世界的应用,大家可以去探索发现。

本文分享自微信公众号 - R语言交流中心(R_statistics)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据森麟

基于大数据的推荐算法综述

致力于为机器学习、深度学习、数据挖掘等AI技术的“初学者”或者“爱好者”,进行基础理论与实战技能的介绍和学习。我们团队成员既有各个著名院校的在校硕士生、博士生,...

14120
来自专栏DevOps持续集成

05-Shell-位置变量与预定义变量

$* : 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个

5720
来自专栏五分钟学算法

GitHub 标星 5w+,计算机小白到大牛的学习之路!

计算机科学一直是近年来高考报考的热门专业,是一门研究计算机相关规律的学科。近年来,随着开源社区的蓬勃发展,以及人工智能对各行各业的影响,很多人希望能够通过系统全...

11610
来自专栏用户5521492的专栏

创建节约内存的 JavaBean

每个普通Java对象在堆(heap)中都有一个头信息(object header),头信息是必不可少的,记录着对象的状态。

9530
来自专栏用户5521492的专栏

为什么要重写 hashcode 和 equals 方法?

来源:cnblogs.com/JavaArchitect/p/10474448.html

12130
来自专栏APP测试

Jmeter&badboy环境搭建

注:如果电脑没有安装JDK,那么一定要记得,提前安装好JDK,并配置好环境变量哦。

16820
来自专栏用户5521492的专栏

谈谈 Spring IOC

学习过 Spring 框架的人一定都会听过 Spring 的 IoC(控制反转) 、DI (依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、...

8020
来自专栏用户5521492的专栏

Java 并发编程 71 道面试题及答案

任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thre...

7830
来自专栏人力资源数据分析

不懂数学的你也可以做薪酬的分位置算法

在人力资源的薪酬模块里,有一个概念叫做薪酬的分位置,这个分位置的计算一直用在公司内部薪酬对比外部的薪酬部门,用过分为值的算法来分析公司的薪酬是否有竞争力,...

10020
来自专栏用户5521492的专栏

你清楚这几个 Spring 常用注解吗?

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:

6910

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励