最初對於牛頓法,我本人是一臉懵的。其基本原理來源於高中知識。在如下圖所示的曲線,我們需要求的是f(x)的極值:

對於懵的原因,是忘記了高中所學的點斜式(Point Slope Form),直接貼一張高中數學講義:

因為我們一路沿着x軸去尋找解,所以迭代求f(x)=0的解得通用式為:

與梯度下降相比,牛頓法也同樣是沿着曲線的斜率去尋找極值,但是不存在需要自定義learning rate的問題,因為alpha是由斜率來決定的。
牛頓法的python實現:
def newtons(f,df,x0,e):
xn = float(x0)
e_tmp = e+1
loop = 1
while e_tmp>e:
print '########loop'+str(loop)
k = df(xn)
xm = f(xn)
print 'xn='+str(xn)+',k='+str(k)+',y='+str(xm)
q = xm/k
xn = xn-q
e_tmp = abs(0-f(xn))
print 'new xn='+str(xn)+',e='+str(e_tmp)+',q='+str(q)
loop=loop+1
return xn
我們調用一下:
from Test1.newtonMethod import newtons
def f(x):
return x**2+2*x
def df(x):
return 2*x+2
x = newtons(f,df,3,0.01)
print 'the point you find is '+str(x)
運行結果如下:
########loop1 xn=3.0,k=8.0,y=15.0 new xn=1.125,e=3.515625,q=1.875 ########loop2 xn=1.125,k=4.25,y=3.515625 new xn=0.297794117647,e=0.684269571799,q=0.827205882353 ########loop3 xn=0.297794117647,k=2.59558823529,y=0.684269571799 new xn=0.0341661806366,e=0.0694996891724,q=0.26362793701 ########loop4 xn=0.0341661806366,k=2.06833236127,y=0.0694996891724 new xn=0.000564381199631,e=0.0011290809254,q=0.0336017994369 the point you find is 0.000564381199631
