优秀的讲解博客
算法简述
梯度下降通常是通过迭代的方式来搜索某个函数的极大/小值,他对目标函数每个变量求偏导得出梯度,也就是沿着梯度方向函数值会增加的最快,那么要求最小值就要沿着梯度值的反方向,梯度下降分为随机梯度下降与批量梯度下降,以及小批量梯度下降,随机梯度相比批量梯度耗时少,但精度不如批量高,批量每一步都沿着下降最快的方向下降,但是样本很多的话 耗时很多,还有就是随机梯度具有随机的特性,可能会跳出局部最优解从而到达全局最优解,而批量梯度则会一步步的走向局部最优解
模拟梯度下降法
梯度下降搜索一元二次方程最小值
通过梯度下降 求解 y = (x-2.5) ^ 2 - 1的 最小值
import numpy as np
import matplotlib.pyplot as plt
plot_x = np.linspace(-1., 6., 141)# 造一个数据
plot_y = (plot_x-2.5) ** 2 - 1.
#plt.plot(plot_x, plot_y)
#plt.show()
epsilon = 1e-8 #误差
eta = 0.1 # 学习率
def J(theta):# 要求解的函数
return (theta - 2.5) ** 2 - 1.
def dJ(theta): # 对函数求导之后的式子
return 2*(theta-2.5)
theta = 0.0 # theta初始值赋值0
theta_history = [theta] #用来记录theta曾经的取值,来获取theta的变化趋势
while True:
gradient = dJ(theta) #求出梯度
last_theta = theta #记录下之前的theta
theta = theta - eta * gradient #沿着梯度求出新的theta
theta_history.append(theta)
if(abs(J(last_theta)-J(theta)) < epsilon): # 如果变得够小了就默认到达了极值点
break
print(theta) # 最小值的theta
print(J(theta)) #最小值是多少
plt.plot(plot_x, plot_y)
plt.plot(np.array(theta_history), J(np.array(theta_history)), color = 'r', marker = '+' )
plt.show()
# 此算法如果eta取值过大会死循环,因此也可以直接限制他的次数
def gradient_descent(initial_theta, eta, n_iters = 1e4, epsilon=1e-8):
theta = initial_theta
i_iter = 0
theta_history.append(initial_theta)
while i_iter < n_iters:
gradient = dJ(theta)
last_theta = theta
theta = theta - eta * gradient
theta_history.append(theta)
if(abs(J(theta) - J(last_theta)) < epsilon):
break
i_iter += 1
return
2.499891109642585
-0.99999998814289
利用批量梯度下降法求解简单线性回归模型
用批量梯度下降来搜寻一个一元线性回归模型,所以其根本就是搜索损失函数最小值所对应的系数,对于一般的平方损失函数,求它的梯度,会导致梯度的大小与样本的数量有关,所以我们就在损失函数前面除以一个m,然后分别求偏导得出梯度,其推到如下图
、
、
import numpy as np
import matplotlib.pyplot as plt
#构造一个线性回归数组
np.random.seed(<