梯度下降法
梯度下降法来说,在神经网络中用到,最小化误差的一种优化方法。用梯度下降法求函数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)
反向推理,就能明白梯度上升为什么是加梯度,而梯度下降是减梯度。