数据表:链接: https://pan.baidu.com/s/1sSz7F_yf_JeumXcP4EjE5g?pwd=753f 提取码: 753f
核心流程:
import numpy as np
# 计算误差函数 points是数据集中数据的位置
def compute_error_for_line_given_points(b,w,points):totalError=0for i in range(0,len(points)):x=points[i,0]y=points[i,1]totalError+=(y-(w*x+b))**2 # 公式return totalError/float(len(points)) # 均方误差# 梯度下降的参数更新
def step_gradient(b_current,w_current,points,learningRate):b_gradient=0w_gradient=0N=float(len(points))for i in range(0,len(points)):x=points[i,0]y=points[i,1]b_gradient+=(2*(w_current*x+b_current-y))/N # loss函数对b求导 学习率的公式!w_gradient+=(2*(w_current*x+b_current-y)*x)/N # loss函数对w求导new_b=b_current-learningRate*b_gradientnew_w=w_current-learningRate*w_gradientreturn [new_b,new_w]def gradient_descent_runner(points,starting_b,starting_w,learing_rate,num_iterations):b=starting_bw=starting_wmin_error = float('inf') # 初始化为正无穷大best_b = bbest_w = wfor i in range(num_iterations):b,w=step_gradient(b,w,np.array(points),learing_rate)error = compute_error_for_line_given_points(b, w, points)# 如果当前误差小于之前记录的最小误差,则更新最小误差和最佳参数if error < min_error:min_error = errorbest_b = bbest_w = wreturn [b,w,best_b,best_w]def run():points=np.genfromtxt("E:/first/project/resource/pytorch/simple-regression/data.csv",delimiter=",")learning_rate=0.0001initial_b=0initial_w=0num_iterations=1000print("Starting gradient descent at b={0},w={1},error={2}".format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,points)))[b,w,best_b,best_w]=gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)print("After {0} interations b={1},w={2},error={3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))print("After {0} interations best_b={1},best_w={2},error={3}".format(num_iterations,best_b,best_w,compute_error_for_line_given_points(best_b,best_w,points)))
run()
当梯度下降法逐渐接近损失函数的最小值时,损失函数对参数的梯度(即导数)会趋近于零。这是因为在最小值点处,损失函数的变化率(即斜率)是最小的。因此,当 b_gradient 和 w_gradient 变得非常小时,更新量 learningRate * b_gradient 和 learningRate * w_gradient 也会变得非常小,导致 b 和 w 的变化几乎可以忽略不计。所以一般线性模型只有一个最低点的时候,会出现这种情况,找到最合适的b w后,后续迭代参数几乎不会变化
的变化几乎可以忽略不计。所以一般线性模型只有一个最低点的时候,会出现这种情况,找到最合适的b w后,后续迭代参数几乎不会变化