梯度下降法和梯度上升法

梯度下降法

梯度下降法来说,在神经网络中用到,最小化误差的一种优化方法。用梯度下降法求函数f(x)=2x^2+4x+5的极小值。
在这里插入图片描述
在此函数中,(-2,-1)区间,对任意一点xi,导数都为负数;
在此函数中,(-1, 0)区间,对任意一点xi,导数都为正数;
这样,在梯度下降中,公式 在这里插入图片描述就容易解释了,在(-2,-1)区间,导数在这里插入图片描述为负数,更新的在这里插入图片描述在增大,一直向最低点逼近;同样在(-1,-2)区间,导数在这里插入图片描述为正数,更新的在这里插入图片描述在减小,一直向最低点逼近。
代码如下:

# -*- coding: utf-8 -*-
# @Time : 2019/12/18 17:06
# @Author : Zhanghui

import matplotlib.pyplot as plt
import  numpy as np
"""
梯度下降算法
求函数f(x)=2x^2+4x+5的最小值
"""
# 函数导数
def Derivatives(old):
    return -4*old+4

#梯度上升算法
def GradientAscent():
    xcord = []  #保存x坐标
    ycord = []  #保存y坐标
    xnew = 0    #梯度算法的初始值
    alpha = 0.01 # 学习速率(一般根据经验和具体需要设置)
    maxCycle = 100 #学习次数
    for k in range(maxCycle):
        xold = xnew
        xnew = xold + alpha *Derivatives(xold) #梯度上升公式
        xcord.append(xnew)
        ycord.append(2*np.square(xnew) + 4*xnew+5)
    return xcord,ycord #返回每一次学习完后的x,y值

#画图
def plotFig(xcord,ycord):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord, ycord, s=4, c='red', marker='s', alpha=.5) #绘制每次学习后x,y值
    x = np.arange(-2,0,0.01)
    y = 2*np.square(x) + 4*x+5
    ax.plot(x,y)            #绘制-2x^2+4x+5 函数
    plt.title('BestFit')  # 绘制title
    plt.xlabel('X')
    plt.ylabel('Y')  # 绘制label
    plt.show()

if __name__== '__main__':
    xcord, ycord = GradientAscent()
    plotFig(xcord,ycord)

梯度上升法

在梯度上升法是在逻辑回归中求概率最大值,即求最大似然函数的最大值用到的方法,求函数f(x)=-2x^2+4x+5的极大值为例。
在这里插入图片描述
在此函数中,(0,1)区间,对任意一点xi,导数都为正数;
在此函数中,(1, 2)区间,对任意一点xi,导数都为负数;
这样,在梯度下降中,公式 在这里插入图片描述就容易解释了,在(0,1)区间,导数在这里插入图片描述为正数,更新的在这里插入图片描述在增大,一直向最高点逼近;同样在(1,2)区间,导数在这里插入图片描述为负数,更新的在这里插入图片描述在减小,一直向最高点逼近。
代码示例:

# -*- coding: utf-8 -*-
# @Time : 2019/12/18 17:06
# @Author : Zhanghui

import matplotlib.pyplot as plt
import  numpy as np
"""
梯度上升算法
求函数f(x)=-2x^2+4x+5的最大值
"""
# 函数导数
def Derivatives(old):
    return -4*old+4

#梯度上升算法
def GradientAscent():
    xcord = []  #保存x坐标
    ycord = []  #保存y坐标
    xnew = 0    #梯度算法的初始值
    alpha = 0.01 # 学习速率(一般根据经验和具体需要设置)
    maxCycle = 100 #学习次数
    for k in range(maxCycle):
        xold = xnew
        xnew = xold + alpha *Derivatives(xold) #梯度上升公式
        xcord.append(xnew)
        ycord.append(-2*np.square(xnew) + 4*xnew+5)
    return xcord,ycord #返回每一次学习完后的x,y值

#画图
def plotFig(xcord,ycord):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord, ycord, s=4, c='red', marker='s', alpha=.5) #绘制每次学习后x,y值
    x = np.arange(0,2,0.01)
    y = -2*np.square(x) + 4*x+5
    ax.plot(x,y)            #绘制-2x^2+4x+5 函数
    plt.title('BestFit')  # 绘制title
    plt.xlabel('X')
    plt.ylabel('Y')  # 绘制label
    plt.show()

if __name__== '__main__':
    xcord, ycord = GradientAscent()
    plotFig(xcord,ycord)

反向推理,就能明白梯度上升为什么是加梯度,而梯度下降是减梯度。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值