多变量线性回归模型——梯度下降法、随机梯度下降法之python实战

本文通过实例展示了在多变量线性回归中,如何使用梯度下降法和随机梯度下降法对广东省广州市海珠区的房价数据进行建模。讨论了不同学习率、数据预处理对模型训练的影响,并提供Python代码实现。
摘要由CSDN通过智能技术生成

这篇文章主要讲述在多变量线性回归模型中运用梯度下降法与随机梯度下降法解决问题的方法。有关于梯度下降法的数学推导不做讲述的重点。在这篇文章里,我们将对一个包含50个样本的数据集使用多变量回归模型进行处理,通过实操来加深对梯度下降法的理解。

一、语言和IDE

python3.7 + pycharm


二、问题陈述

给定一个名为“dataForTraining.txt”的文件。该文件包含广东省广州市海珠区的房价信息,里面包含50个训练样本数据。文件有三列,第一列对应房的面积(单位:平方米),第二列对应房子距离双鸭山职业技术学院的距离(单位:千米),第三列对应房子的销售价格(单位:万元)。每一行对应一个训练样本。请使用提供的50个训练样本来训练多变量回归模型以便进行房价预测,请用(随机)梯度下降法的多变量线性回归模型进行建模。为了评估训练效果,另外给定测试数据集“dataForTesting.txt” (该测试文件里的数据跟训练样本具有相同的格式,即第一列对应房子面积,第二列对应距离,第三列对应房子总价)。


三、问题求解

A、梯度下降法

使用多变量线性回归模型求解,假设函数为

模型参数为3个。初始条件下,theta、theta1、theta2均设定为0,学习率设定为0.00015。使用梯度下降的方法进行训练,对theta0、theta1、theta2进行迭代,迭代规则如下:

误差计算公式如下:

迭代结果如下:

      曲线图:

    数据记录:

由以上结果可看到梯度下降法的效果很好,训练误差不断收敛,测试误差也保持一个较小的稳定值。

python源码

1.	import numpy as np  
2.	import matplotlib.pyplot as plt  
3.	from prettytable import PrettyTable  
4.	  
5.	  
6.	def list_to_matrix(filename):  # 这个函数将txt文件中的数据读取出来,存进一个matrix中  
7.	    np.set_printoptions(suppress=True)  # 使输出不为科学计数法形式  
8.	    fr = open(filename)  
9.	    arrayOLines = fr.readlines()  
10.	    numberOFLines = len(arrayOLines)  # 获取此list的行数  
11.	    returnMat = np.zeros((numberOFLines, 3))  # 返回的矩阵是numberOFLines * 3 的  
12.	    index = 0  
13.	    for line in arrayOLines:  
14.	        line = line.strip()  # 移除每一行结尾的最后符号,即'\n'符;  
15.	        listFromLine = line.split(' ')   # 移除每一行中出现的' '符;  
16.	        returnMat[index, :] = li
首先,你需要读取linearRegression_data.txt文件中的数据并将其存储在一个Numpy数组中。假设数据文件中的第一列是特征,第二列是目标变量,你可以使用以下代码读取数据: ```python import numpy as np data = np.loadtxt('linearRegression_data.txt', delimiter=',') X = data[:, 0] # 特征 y = data[:, 1] # 目标变量 m = len(y) # 样本数量 ``` 接下来,你需要定义代价函数和梯度下降函数。假设模型为$y = \theta_0 + \theta_1 x$,代价函数和梯度下降函数可以分别定义为: ```python def cost_function(X, y, theta): J = np.sum((X.dot(theta) - y) ** 2) / (2 * m) return J def gradient_descent(X, y, theta, alpha, num_iters): J_history = np.zeros(num_iters) for i in range(num_iters): theta = theta - (alpha / m) * (X.T.dot(X.dot(theta) - y)) J_history[i] = cost_function(X, y, theta) return theta, J_history ``` 其中,`cost_function`计算代价函数的值,`gradient_descent`执行梯度下降算并返回学习到的参数$\theta$和每次迭代的代价函数值。`alpha`是学习率,`num_iters`是迭代次数。 最后,你可以使用以下代码运行梯度下降算并输出学习到的参数和代价函数的变化: ```python # 添加一列全为1的向量作为截距 X = np.hstack((np.ones((m, 1)), X.reshape(m, 1))) # 初始化参数 theta = np.zeros(2) # 运行梯度下降算 alpha = 0.01 num_iters = 1500 theta, J_history = gradient_descent(X, y, theta, alpha, num_iters) # 输出学习到的参数和代价函数的变化 print('Theta found by gradient descent: {:.4f}, {:.4f}'.format(*theta)) ``` 你可以根据实际情况修改学习率和迭代次数。在运行完上述代码后,你应该能够得到学习到的参数和代价函数的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值