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、收敛过程如下图所示: