机器学习与数据挖掘机器学习和人工智能入门AI机器学习及python实现

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

2018-12-02  本文已影响5人  applecai

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

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

上一篇 下一篇

猜你喜欢

热点阅读