最近看到描述说牛顿法求最小值,一下子反应不过来了,牛顿不是求根的吗?怎么变成求最小值了,然后再想了下牛顿迭代一直向下,真的会跑到最小值的,即导数为0的地方,那么牛顿法又是怎么求根的呢?根一般可能有多个,而且不是最小值呀!突然间混乱了。
我需要重新推导,作图,来加强理解,其实主要原因是初始化模型搞混乱了。求根的话,即导数函数与f(x)=0这条直线上的交点x还是计算新的导数函数。所以x都是在f(x)=0上的,终止条件是xn+1-xn=0.0001(某个精度的值,自定义)。而且公式中没有学习率alpha.他是x的逐次逼近。
我用python求的y=(x-2)^2-1的一个根,其标注的放大图为如下,打印结果为3
他的数学模型为(f(xi)-0)/( xi+1- xi)= f′(xi)这是斜率公式,于是推导得出如下逼近公式。
xi+1 = xi -f(xi)/f′(xi)
Python3.6的源码如下
from sympy import *
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist.axislines import SubplotZero
listx=[]
listy=[]
def fn(x):
return(x**2-4*x+3)
def NewTon(f, s = 1, maxiter = 100,prt_step = False):
for i in range(maxiter):
s = s - f.evalf(subs={x:s})/f.diff().evalf(subs={x:s})
listx.append(s)
listy.append(fn(s))
print(s,fn(s))
if prt_step== True:
print("After {0} iteration, the solution is
updated to {1}".format(i+1,s))
return s
fig = plt.figure(1)
ax = SubplotZero(fig,1, 1, 1)
fig.add_subplot(ax)
ax.axis["xzero"].set_visible(True)
xn = np.linspace(-2,5,50)
#生成sigmiod形式的y数据x = Symbol("x")
f = x**2-4*x+3
print(NewTon(f, s = 4, maxiter = 4, prt_step = True))
# #绘制图形plt.plot(xn,fn(xn), c='b')
plt.plot(listx,listy,c='r')
plt.scatter(listx,listy,color='black')
plt.title(r'Newton calc')
plt.show()
那么再看看梯度下降求y=(x-2)^2-1的最小值。用的是f’(x)=0的数学模型,源码如下:打印结果为2
from sympy import *
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist.axislines import SubplotZero
listx=[]
listy=[]
def f(x):
return((x - 2) * (x - 2)-1) #the same as x^2-4x+3
#return(x**2-4*x+3)
def SGD(Xn,alpha):
t =1
i = Symbol("i")
dy = diff((i-2)*(i-2)-1, i) #the same as f(x)
print(dy)
listx.append(Xn)
listy.append(f(Xn))
Xnext = Xn - alpha*dy.evalf(subs={i:Xn})
listx.append(Xnext)
listy.append(f(Xnext))
print(Xnext)
while(abs(Xnext - Xn) > 0.001):
Xn = Xnext
Xnext = Xn - alpha*dy.evalf(subs={i:Xn})
listx.append(Xnext)
listy.append(f(Xnext))
print(t,Xn,Xnext)
t=t+1
if(t>50):
break
#algorithm calc
SGD(4,0.3)
#draw picture
fig = plt.figure(1)
ax = SubplotZero(fig,1, 1, 1)
fig.add_subplot(ax)
x = np.linspace(-2,5,50)
#tag
ax.axis["xzero"].set_visible(True)
plt.xlim(-2,5)
plt.ylim(-2,8)
plt.title("SGD")
#picture
plt.plot(x,f(x),c='b')
plt.plot(listx,listy,c='r')
plt.scatter(listx,listy,color='black')
plt.show()
牛顿法也可以求最小值,是通过泰勒公式展开的。
网友评论