练习1:线性回归

本文介绍了线性回归的实践,包括数据的加载、可视化,以及使用梯度下降法求解线性回归参数。通过Python的numpy、pandas和matplotlib库处理数据,展示如何实现单变量线性回归,绘制数据散点图,并通过梯度下降法优化成本函数,最终得到模型并可视化预测结果。
摘要由CSDN通过智能技术生成

练习1:线性回归


介绍

在本练习中,您将 实现线性回归并了解其在数据上的工作原理。

在开始练习前,需要下载如下的文件进行数据上传

  • ex1data1.txt -单变量的线性回归数据集
  • ex1data2.txt -多变量的线性回归数据集

在整个练习中,涉及如下的必做作业,及标号*选做作业

必做作业为实现单变量的线性回归;选做作业为实现多变量线性回归。

1 实现简单示例函数

在该部分练习中,将通过代码实现返回一个5*5的对角矩阵。输出与如下相同:

1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1

1.1 提交解决方案

在以下代码框中进行如上的实现,完成部分练习后,得到如上的相同结果即为通过。

###在这里填入代码###

import numpy as np
A = np.eye(5)
print(A)



[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

2 单变量线性回归

在该部分练习中,将实现单变量线性回归并用来预测餐车的利润。

假设你是一家餐厅的领导,正在考虑在不同的城市开设新的分店。该连锁店已经在不同的城市有了餐车,并且你能够获得每个城市的人口和利润数据。

现在需要使用这些数据来帮助你选择下一个被扩展的城市。

文件ex1data1.txt包含线性回归问题的数据集。第一列数据对应城市人口,第二列数据对应那座城市的餐车的利润。利润为负时表示亏损。

2.1 绘制数据

在开始进入练习之前,对数据进行可视化通常很有用。对于该数据集,可以使用散点图进行可视化,因为它只有两个属性(人口、利润)。

# 引入所需要的库文件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os

%matplotlib inline
# 数据存储路径
path = 'ex1data1.txt'

# 读入相应的数据文件
data = pd.read_csv(path, header=None,names=['Population','Profit'])

#查看数据的前五条
data.head(5)
PopulationProfit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233

接下来需要实现数据可视化的代码,该部分数据绘制出的图像应与如下相同。

要点:

  • 实现散点图可视化
  • 数据分布为红色点
  • 标清横纵坐标名称

在这里插入图片描述

###在这里填入代码###

data.plot(kind='scatter', x='Population', y='Profit',c='red', figsize=(12,8))
plt.show()


在这里插入图片描述

2.2 梯度下降

在该部分中,将使用梯度下降来选择合适的线性回归参数θ用以拟合给定数据集。

2.2.1 更新公式

线性回归的目的是最小化成本函数:
在这里插入图片描述

假设 h θ ( X ) h_{\theta}(X) hθ(X)由以下线性模型给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pCyGC6QC-1685868056293)(1-3.png)]

回顾一下,模型的参数是 θ j \theta_j θj的值,这些将用来调整以最小化成本 J ( θ ) J(\theta) J(θ)

其中一种方法是使用批量梯度下降算法,在批量梯度下降中,每次迭代地执行更新,随着梯度下降的每一步计算,参数 θ j \theta_j θj越来越接近能够使得成本 J ( θ ) J(\theta) J(θ)达到最低的最佳值。

在这里插入图片描述

2.2.2 实现

在上一部分的练习中,我们已经将所需要用到的数据加载至变量data中,并为其列分别进行命名。

接下来,我们在数据中添加了一个维度来拟合截距项 θ 0 \theta_0 θ0。并将初始参数值设为0,学习率 α \alpha α设为0.01。

#在列索引为0处添加数据列,该列值均为1
data.insert(0, 'Ones', 1)

#获取数据列数
cols = data.shape[1]

#对变量X和y进行初始化,并将其数据类型转换为矩阵
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
X = np.matrix(X.values)
y = np.matrix(y.values)

#学习率、迭代次数的初始化
alpha = 0.01
iterations = 1500
2.2.3 计算成本J(θ)

在执行梯度下降最小化成本函数 J ( θ ) J(\theta) J(θ)时,通过计算成本来监视收敛状态是有帮助的。

在该部分练习任务中,你需要实现一个计算成本 J ( θ ) J(\theta) J(θ)的函数computeCost,用于检查梯度下降实现的收敛性。

其中,Xy不是标量值,而是矩阵,其行代表训练集中的示例。

要点:
完成该函数后,将 θ \theta θ值初始化为0并进行成本的计算,将得到的成本值打印出来。

如果结果为32.07,则计算通过。

###在这里填入代码###


def computeCost(X, y, w):
    inner = np.power(((X * w) - y), 2)
    return np.sum(inner) / (2 * len(X))

w = np.matrix(np.zeros((2,1)))
computeCost(X, y, w)


32.072733877455676
2.2.4 梯度下降

接下来,我们将实现梯度下降,给出的代码已经实现了循环结构,你只需要在每次的迭代中提供 θ \theta θ的更新。

在进行代码实现时,请确保你了解要优化的内容,和正在更新的内容。

请记住,成本 J ( θ ) J(\theta) J(θ)为参数-被向量 θ \theta θ终止,而不是 X X X y y y。也就是说,我们将 J ( θ ) J(\theta) J(θ)的值最小化通过改变矢量 θ \theta θ的值,而不是通过改变 X X X y y y

验证梯度下降是否正常工作的一种好方法是查看 J ( θ ) J(\theta) J(θ)的值,并检查该值每步是否减小。每次迭代时,代码都会调用computeCost函数并打印成本。假设你实现了梯度下降,正确地计算成本, J ( θ ) J(\theta) J(θ)值永远不会增加,并且应该在算法结束时收敛到稳定值。

要点:

实现梯度下降后,需要使用最终的参数值将线性回归的拟合结果进行可视化,绘图结果需要类似如下图所示。
在这里插入图片描述

###在这里填入代码###


def gradientDescent(X, y, w, alpha, iters):
    temp = np.matrix(np.zeros(w.shape))
    parameters = int(w.ravel().shape[1])
    cost = np.zeros(iters)
    for i in range(iters):
        error = (X * w) - y
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[j,0] = w[j,0] - ((alpha / len(X)) * np.sum(term))
        w = temp
        cost[i]=computeCost(X,y,w)
    return w, cost



# 计算最终的参数所得到的成本值
w_final, cost_final = gradientDescent(X, y, w, alpha, iterations)
# 计算最终的参数所得到的成本值
print('The weight vector:\n',w_final)
computeCost(X, y, w_final)

The weight vector:
 [[-3.63029144]
 [ 1.16636235]]





4.483388256587726
###在这里填入代码###
#对拟合曲线进行绘制
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = w_final[0,0] + (w_final[1,0] * x)
 
fig, ax = plt.subplots(figsize=(9,6))
ax.plot(x, f, 'b', label='Prediction')
ax.scatter(data.Population, data.Profit, c='red',label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')


Text(0.5, 1.0, 'Predicted Profit vs. Population Size')

在这里插入图片描述

2.3 可视化成本函数

为了更好地理解成本函数的迭代计算,将每一步计算的cost值进行记录并绘制。

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iterations), cost, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
Text(0.5, 1.0, 'Error vs. Training Epoch')

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值