梯度下降与牛顿法求最小值的区别—Apple的学习笔记

作者: applecai | 来源:发表于2018-12-02 12:30 被阅读5次

    最近看到描述说牛顿法求最小值,一下子反应不过来了,牛顿不是求根的吗?怎么变成求最小值了,然后再想了下牛顿迭代一直向下,真的会跑到最小值的,即导数为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()

    牛顿法也可以求最小值,是通过泰勒公式展开的。

    相关文章

      网友评论

        本文标题:梯度下降与牛顿法求最小值的区别—Apple的学习笔记

        本文链接:https://www.haomeiwen.com/subject/fxdjcqtx.html