ps.线性回归模型可以看我之前发的文章:机器学习:线性回归模型(python)_cornki的博客-CSDN博客
目录
一、什么是梯度下降
梯度下降是一种优化算法,用于最小化一个损失函数。它通过沿着损失函数的负梯度方向迭代来更新模型参数,从而使损失函数不断减小。
二、梯度下降的数学形式
同时更新w和b,重复到收敛:
梯度定义为:
三、直观理解梯度下降
如上图显示,成本曲线相对于𝑤,在图的右侧,导数为正数,而在左侧为负数。由于“碗形”,导数将始终导致梯度下降到梯度为零的底部。
四、学习率
:学习率是梯度下降算法中用于控制每次迭代中参数更新的步长大小的超参数。
如上图所示,学习率越小,则每次迭代中参数更新的步长越小,算法收敛的速度较慢,但是更有可能找到全局最优解。学习率越大,则每次迭代中参数更新的步长越大,算法能够更快地收敛到最优解,但是可能会出现无法收敛或者收敛到局部最优解的问题。因此,在使用梯度下降算法时,需要根据具体问题选择合适的学习率。
通常初始学习率可选取范围为0.01~0.1,具体取值需要根据问题复杂程度、数据集大小等进行调整。
在编写代码时可以通过生成图形来判断自己设置的学习率是否合适
五、代码实践(python)
# 导入numpy、matplotlib模块
import numpy as np
from matplotlib import pyplot as plt
# 设定特征值
x_train = np.array([1,2,3,4,5,6] )
y_train = np.array([15,22,31,44,57,62] )
# 设定权重、偏移、学习率、x的数量、方差列表、w的列表(后面作图)
w = 1
b = 0
a = 0.01
m = len(x_train)
J_wb_list = []
w_list = []
# 定义#J_wb函数(方差)
def J_wb(w,x,b,m):
cost_sum = 0
for i in range(m):
f_wb = w * x[i] + b
cost = (f_wb - y_train[i]) ** 2
cost_sum = cost_sum + cost
J_wb = 1 / (2 * m) * cost_sum
return J_wb
# 定义w_new函数(优化w值)
def w_new(w,x,b,m,a):
cost_w_sum = 0
for i in range(m):
f_wb = w * x[i] + b
cost_w = (f_wb - y_train[i]) * x[i]
# print(cost_w)
cost_w_sum = cost_w_sum + cost_w
J_wb_w = w - (1 / m) * a * cost_w_sum
return J_wb_w
# 定义b_new函数(优化b值)
def b_new(w,x,b,m,a):
cost_b_sum = 0
for i in range(m):
f_wb = w * x[i] + b
cost_b = f_wb - y_train[i]
cost_b_sum = cost_b_sum + cost_b
J_wb_b = b - (1 / m) * a * cost_b_sum
return J_wb_b
# 设置循环判定条件和结束条件
J_wb_one = J_wb(w,x_train,b,m)
w_one = w_new(w,x_train,b,m,a)
b_one = b_new(w,x_train,b,m,a)
w=w_one
b=b_one
# 如果方差在图形(学习率的图片)左侧
if J_wb_one > J_wb(w,x_train,b,m):
while J_wb_one > J_wb(w,x_train,b,m):
J_wb_one = J_wb(w, x_train, b, m)
w_one = w_new(w,x_train,b,m,a)
b_one = b_new(w,x_train,b,m,a)
w=w_one
b=b_one
J_wb_list.append(J_wb(w, x_train, b, m))
w_list.append(w)
if J_wb(w,x_train,b,m) == J_wb_one:
break
# 如果方差在图形(学习率的图片)右侧
else:
while J_wb_one < J_wb(w,x_train,b,m):
J_wb_one = J_wb(w, x_train, b, m)
w_one = w_new(w,x_train,b,m,a)
b_one = b_new(w,x_train,b,m,a)
w=w_one
b=b_one
J_wb_list.append(J_wb(w, x_train, b, m))
w_list.append(w)
if J_wb(w,x_train,b,m) == J_wb_one:
break
print(w,b,J_wb(w,x_train,b,m))
# 绘制成本函数点
plt.scatter(w_list, J_wb_list)
# 绘制成本函数线
plt.plot(w_list, J_wb_list, color='red')
# 添加标题和标签
plt.title('Change map')
plt.xlabel('w')
plt.ylabel('J_wb')
# 显示图形
plt.show()
循环中的if语句是为了防止方差为0而导致死循环