Python手写实现梯度下降算法(核心是求极值,必须是凸函数),使用matplotlib绘制过程图

1、什么是梯度下降:

梯度就是函数在一个点的斜率,梯度下降,就是在求函数极值的过程中,让斜率减小,从而找到极大值或极小值点,因为在几何坐标系里,极值点的斜率是零

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

# f(x) = (x-10)**2, 目标函数
# f'(x) = 2*x - 20  梯度函数:一阶导数函数

# 梯度下降算法是一个方法,是帮助我们找极值点的方法cost # 凸函数
def targetFunc(x):
    return (x-10)**2
    pass

def gradientFunc(x):
    return 2*x - 20
    pass

listx = []

# 猜测的过程
def gradientCal(initX, targetFunc, gradientFunc, rating=0.1, tolent=0.000000001, times = 500000):
    '''
    :param initX: 猜测的点
    :param targetFunc: 目标函数
    :param gradientFunc: 梯度函数
    :param rating: 步进系数
    :param tolent: 收敛条件
    :return: 返回极值点x值
    '''
    result = targetFunc(initX)           # 计算出initX这个点的实际值
    gradientResult = gradientFunc(initX) # 计算出initX这个点的导数,也是斜率,梯度
    listx.append(initX)
    newX = initX - rating*gradientFunc(initX)
    newResult = targetFunc(newX)

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

    pass

if __name__ == "__main__":
    print(gradientCal(-10, targetFunc, gradientFunc))
    x = np.arange(-10, 10+1, 1)
    y = (x - 10)**2

    plt.plot(x, y)
    plt.grid(linestyle='--')
    plt.scatter(np.array(listx), (np.array(listx) - 10)**2 , s=20)
    plt.show()

    print(listx)
    pass

2、收敛过程如下图所示:

Python手写实现梯度下降算法(核心是求极值,必须是凸函数),使用matplotlib绘制过程图_第1张图片

你可能感兴趣的:(Python,机器学习,人工智能)