机器学习之牛顿法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/78547539

泰勒公式

首先看泰勒公式,对于函数,如果函数平滑且某点存在各阶导数,则可以用一个多项式来描述该点邻域的近似值。公式如下:

这里写图片描述

牛顿法

牛顿法一般用来求解方程的根和求解极值。

数值优化算法除了梯度下降法外还有比较常用的一种方法是牛顿法。对于非线性方程,可以用牛顿迭代法进行求解,它收敛速度快。

基本思想是:对于非线性函数f(x),根据泰勒公式得到x附近某个点xk展开的多项式可用来近似函数f(x)的值,该多项式对应的函数为F(x),求得F(x)的极小值作为新的迭代点,然后继续在新的迭代点泰勒公式展开,直到求得的极小值满足一定的精度。

原理

假设函数f(x)二次可微,则二次泰勒展开,

f(x)g(x)=f(xk)+f(xk)(xxk)+12f′′(xk)(xxk)2

g(x)多项式则为f(x)的近似,求函数f(x)极值则可以转化为求导函数为0,对g(x)求导并令其为0,
f(xk)+f′′(xk)(xxk)=0

得到,
x=xkf(xk)f′′(xk)

即得到迭代公式,
xk+1=xkf(xk)f′′(xk)

新的点xk+1不断逼近极值,直到一次导数小于某误差。

迭代步骤

  1. 确定初始点x0,确定误差大小e。
  2. 计算f(xk),若它的绝对值小于e则停止迭代,xk即为极值点。
  3. 计算f′′(xk),并根据迭代公式求得xk+1
  4. 跳转到步骤2。

实现代码


def h(x):
    return x*x*x + 2*x*x +3*x + 4

def h1(x):
    return 3*x*x + 4*x + 3

def h2(x):
    return 6*x + 4

xk = 0
k = 1
y = 0
e = 0.0001
times = 10000

while k < times:
    y = h(xk)
    a = h1(xk)
    if abs(a) <= e:
        break
    b = h2(xk)
    xk -= a/b
    k += +1
print("k = ", k)
print("x = ", xk)
print("y = ", y)

以下是广告

========广告时间========

公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述
这里写图片描述

阅读更多

扫码向博主提问

超人汪小建(seaboat)

博客专家

java深度,架构,AI,中间件,高并发
  • 擅长领域:
  • java
  • 架构
  • 中间件
  • tomcat
  • AI
去开通我的Chat快问
换一批

没有更多推荐了,返回首页