梯度下降初识-求取凸函数极值

梯度下降初识-求取凸函数极值

梯度下降:梯度下降是迭代法的一种,通过选择一个初始点,然后计算该点的导数,再通过导数和步长推进到下一个点,直到两个点之间的差值很小为止。

# 梯度下降 == 导数值下降
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

#梯度下降算法是一个帮助我们找极值点的方法cost  #凸函数
def targetFunc(x,y):        #目标函数
    return(x-100)**2+y**2
    pass
def gradientFuncX(x):       #求解偏导数
    return 2*x - 200
    pass
def gradientFuncY(y):       #求解偏导数
    return 2*y
listx=[]
listy=[]
#猜测的过程
def gradientCal(initX,initY,targetFunc,gradientFuncX,gradientFuncY,rating=0.1,tolent=0.0000000001,times=500000):
    '''

    :param initX: 猜测的点
    :param gradientFunc: 目标函数
    :param rating: 步进系数
    :param tolent: 收敛条件
    :return: 返回极值点x值
    '''
    result=targetFunc(initX,initY)             

    newX = initX - rating*gradientFuncX(initX)
    newY = initY-rating*gradientFuncY(initY)
    newResult = targetFunc(newX,newY)

    reResult=np.abs(result-newResult)
    t=0
    while reResult>tolent and t<times:
        t+=1
        initX=newX
        initY=newY
        result=newResult
        listx.append(initX)
        listy.append(initY)
        newX=newX-rating*gradientFuncX(newX)
        newY = newY - rating * gradientFuncY(newY)
        newResult=targetFunc(newX,newY)
        reResult=np.abs(result-newResult)
        pass
    return initX,initY

    pass

if __name__=="__main__":
    print(gradientCal(-100,200,targetFunc,gradientFuncX,gradientFuncY))
    x=np.arange(-100,220+1,1)
    y=np.arange(-100,220,1)
    fig = plt.figure()
    ax = Axes3D(fig)
    X, Y = np.meshgrid(x, y)
    Z = np.add((x-100)**2, Y ** 2)
    a = np.array(listx)
    b = np.array(listy)
    plt.grid(linestyle='--')
    ax.scatter(np.array(listx), np.array(listy), np.array(listx)**2+np.array(listy)**2, s=20, c = 'r')
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color="white",alpha =0.5)
    plt.show()
    print(a+b)   #最终结果

  • 运行图片如图所示 :
    梯度下降初识-求取凸函数极值_第1张图片

你可能感兴趣的:(梯度下降初识-求取凸函数极值)