原理
对于求方程解问题,
假设有函数 f :R->R
,我们希望找到满足 f(
θ)=0
的
θ
值. 这里
θ
是实数.
牛顿方法执行下面的更新
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/8a241bba490480084dd690d26628e646.png)
求解过程如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/15b7ae0c2a85b7da95140c94c205f81e.jpeg)
简单的来说
就是通过求当前点的导数得到下一个点.用到的性质是导数值等于该点切线和横轴夹角的正切值
利用凸函数的性质,最值所在点 l'(θ
)=0
令f(
θ)=l'(θ)
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/73a98a38954f96a57bea5ab139e8ca91.png)
牛顿方法的一般化:
如果θ是一个向量,那么:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/0e94d094fefde0cf6cd5876230a27cab.png)
H称为
海森
矩阵(Hessian matrix)
,是一个n*n的矩阵,n是特征量的个数,并且
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/30003c0175fcaa52ab3598d197447da6.png)
牛顿方法的收敛速度比批处理梯度下降快很多,很少次的迭代就能够非常接近最小值了;但是当n很大时,每次迭代求海森矩阵和逆代价是很大的。
牛顿法是二阶收敛,梯度下降法是一阶收敛的,所以牛顿法看得更远,收敛更快。牛顿法的路径更符合最优路径。对于二阶凸函数能够一步到达。
实际中常常先用梯度下降法,在离得比较近时使用牛顿法;由于牛顿法需要每次更新海森矩阵,所以使用拟牛顿法。
举例
求解问题 f(x
1,x
2) = -x
1
4 - 2x
2
4 + 2x
1x
2 + 2x
2 + 6
▽
x1f =-4x
1
3+2x
2
▽
x2f = 2x
1-8x
2
3+2
Hessian = [ -12x
1
2, 2; 2, -24x
2
2]
迭代次数计数
{
[x1 ; x2 ] = [x 1 ; x 2 ] - Hessian 点乘 [ ▽ x1 f ; ▽ x2 f ]}
![figure_1-5.png](https://i-blog.csdnimg.cn/blog_migrate/e35fb28c3339e8a310dca478d06d87d4.png)
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 12 23:56:25 2017
@author: LoveDMR
牛顿方法
"""
import numpy as np
import matplotlib.pyplot as plt
delta = 0.25
x1 = np.arange( -10 , 10 , delta )
x2 = np.arange( -10 , 10 , delta )
X1 , X2 = np.meshgrid( x1 , x2 )
Y = 2*X1*X2+2*X2-X1**4-2*X2**4 + 6
plt.figure()
bg_fig = plt.contour(X1,X2,Y)
theta = np.array([8,8])
a , b = [] , []
a.append(theta[0])
b.append(theta[1])
H = np.array([[2,3],[3,10]])
Hi = np.linalg.inv(H)
for i in xrange(1,50):
t = np.array([theta[0]**3*(-4)+2*theta[1]**2 , (-8)*theta[1]**3+2*theta[0]+2])
H = np.array([[(-12)*theta[0]**3,2],[2,(-24)*theta[1]**2]])
Hi = np.linalg.inv(H)
theta = theta - np.dot( Hi ,t )
a.append(theta[0])
b.append(theta[1])
plt.plot(a , b)
plt.title( "Newton's method" )
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()