梯度下降法
梯度下降法是一种常用迭代方法,其目的是让输入向量找到一个合适的迭代方向,使得输出值能达到局部最小值。在拟合线性回归方程时,我们把损失函数视为以参数向量为输入的函数,找到其梯度下降的方向并进行迭代,就能找到最优的参数值。
1.计算对于给定的线性模型 (y = wx + b) 的均方误差(MSE)。它接受截距 (b
)、斜率 (w
) 和点集 (points
),然后遍历所有点,计算每个点的预测值,与真实值之差的平方和,最后返回平均误差。
2.更新w和b
3.多次迭代后,得到最优的w和b,也就是y=wx+b这个模型对于给定数据集的最优
这里给定数据集:100个(x,y)
import torch
import numpy as np#计算给定点集的线性回归的误差 y = wx + b
def compute_error_for_line_given_points(b,w,points):total_error = 0for i in range(len(points)):x = points[i,0]y = points[i,1]total_error += (y - (w*x + b))**2return total_error/float(len(points))#梯度下降法求解线性回归 w = w - learning_rate * w_gradient, b = b - learning_rate * b_gradient
def step_gradient(b_current,w_current,points,learning_rate):b_gradient = 0w_gradient = 0n = float(len(points))for i in range(len(points)):x = points[i,0]y = points[i,1]b_gradient += -(2/n) * (y - ((w_current*x) + b_current))w_gradient += -(2/n) * x * (y - ((w_current*x) + b_current))new_b = b_current - (learning_rate * b_gradient)new_w = w_current - (learning_rate * w_gradient)return [new_b,new_w]#迭代梯度下降法求解线性回归
def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):b = starting_bw = starting_wfor i in range(num_iterations):b,w = step_gradient(b,w,points,learning_rate)return [b,w]def run():points = np.genfromtxt('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)))print("Running...")[b,w] = gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)print("After {0} iterations b = {1}, w = {2}, error = {3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))if __name__ == '__main__':run()
执行结果: