批量梯度下降算法
背景:
批量梯度下降算法是1847年由著名数学家Cauchy给出的,它是解析法中最古老的一种,其他解析方法或是它的变形,或是受它的启发而得到的,因此它是最优化方法的基础。作为一种基本的算法,他在最优化方法中占有重要地位。
优点:工作量少,存储变量较少,初始点要求不高;
缺点:收敛慢,效率不高,有时达不到最优解。
所谓梯度下降就是导数值下降
梯度函数是由目标函数求导或偏导得到的,目的是找出目标函数的极值点
具体代码如下:
import matplotlib.pyplot as plt
import numpy as np
# f(x) = x^2, 目标函数
# f'(x) = 2*x 梯度函数:一阶导数函数
# f(x1, x2...xn) = a0 + a1*x1 + a2*x2 + ...+ an*xn #
# 梯度下降算法是一个方法,是帮助我们找极值点的方法cost # 凸函数
def targetFunc(x):
return x**2 # 目标函数
pass
def gradientFunc(x):
return 2*x #梯度函数:目标函数的一阶导
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**2
plt.plot(x, y)
plt.grid(linestyle='--')
plt.scatter(np.array(listx), np.array(listx)**2 , s=20)
plt.show()
# print(listx)
pass
如下图为运行效果: