练习1:线性回归

news2024/11/24 20:52:13

练习1:线性回归


介绍

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

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

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

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

  • 实现简单示例函数----------(5分)
  • 实现数据集显示的函数-------(5分)
  • 计算线性回归成本的函数-----(40分)
  • 运行梯度下降的功能函数-----(50分)
  • 数据标准化*
  • 多变量线性回归的梯度下降功能实现*

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

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
print(np.eye(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.]]

2 单变量线性回归

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

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

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

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

2.1 绘制数据

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

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

%matplotlib inline
# 数据存储路径
path = '/home/jovyan/work/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)由以下线性模型给出:
在这里插入图片描述

回顾一下,模型的参数是 θ 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

    ---------------------------------------------------------------------------

    ValueError                                Traceback (most recent call last)

    <ipython-input-10-ba7d5fe01814> in <module>
          1 #在列索引为0处添加数据列,该列值均为1
    ----> 2 data.insert(0, 'Ones', 1)
          3 
          4 #获取数据列数
          5 cols = data.shape[1]


    /opt/conda/lib/python3.6/site-packages/pandas/core/frame.py in insert(self, loc, column, value, allow_duplicates)
       3220         value = self._sanitize_column(column, value, broadcast=False)
       3221         self._data.insert(loc, column, value,
    -> 3222                           allow_duplicates=allow_duplicates)
       3223 
       3224     def assign(self, **kwargs):


    /opt/conda/lib/python3.6/site-packages/pandas/core/internals.py in insert(self, loc, item, value, allow_duplicates)
       4336         if not allow_duplicates and item in self.items:
       4337             # Should this be a different kind of error??
    -> 4338             raise ValueError('cannot insert {}, already exists'.format(item))
       4339 
       4340         if not isinstance(loc, int):


    ValueError: cannot insert Ones, already exists

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))

theta = np.matrix(np.zeros((2,1)))

computeCost(X,y,theta)


    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, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1]) 
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[j,0] = theta[j,0] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost


# 开始训练,最终输出训练完成的模型参数
t_final, cost_final = gradientDescent(X, y, theta, alpha, iterations)

# 计算最终的参数所得到的成本值
computeCost(X, y, t_final)
    4.483388256587726
###在这里填入代码###
#对拟合曲线进行绘制
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = t_final[0,0] + (t_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')

在这里插入图片描述

选做练习


3 多变量线性回归

在该部分中,将使用多个变量来实现用线性回归预测房屋价格。假设你目前正在出售房屋,想知道什么是好的市场价格。

一种方法是首先收集最近出售房屋的信息,其次是建立房屋价格模型。

文件ex1data2.txt包含俄勒冈州波特兰市的房屋价格及相关信息。第一列是房屋的大小(以平方英尺为单位),第二列是卧室的个数,第三列是房屋的价格。

3.1 特征标准化

以下代码将从文件ex1data2.txt文件中加载并显示该数据集。

通过观察这些数据,可以发现房屋的大小大约是卧室数量的1000倍。而当不同的特征值之间相差几个数量级时,将特征进行缩放可以使梯度下降收敛得更快

path = '/home/jovyan/work/ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2.head()
SizeBedroomsPrice
021043399900
116003329900
224003369000
314162232000
430004539900


在该部分练习中,你的任务是编写代码并实现数据集中的数据标准化

要点

  • 从数据集中减去每个特征的平均值。
  • 减去平均值后,再将新的特征值除以各自的“标准差”

标准差是一种衡量特定特征的值的范围内有多大变化的方法(大多数数据点将位于平均值的两个标准差内);这是取值范围的替代方法。

当标准化特征时,需要存储用于标准化的值——平均值和标准差。从模型中学习参数后,经常需要预测新的房屋的价格。此时给定一个新的 x x x值(房屋面积和卧室数量),必须首先使用先前从训练集中计算的平均值和标准差来对新的数据进行标准化。

###在这里填入代码###
data2 = (data2 - data2.mean()) / data2.std()
data2.head()

SizeBedroomsPrice
00.130010-0.2236750.475747
1-0.504190-0.223675-0.084074
20.502476-0.2236750.228626
3-0.735723-1.537767-0.867025
41.2574761.0904171.595389

3.2 梯度下降

在之前的练习中,我们使用单变量线性回归实现了梯度下降的问题。在该部分联系中,唯一的区别是,此时我们的数据变为矩阵 X X X

假设函数和批次梯度下降的更新规则保持不变,你的任务是代码实现多变量线性回归的成本函数和梯度下降

要点

  • 确保你的代码中可以支持任何大小的数据,并且数据均已被向量化。
  • 代码实现成本函数和梯度下降后,最终的成本值应大约为0.13。
  • 请依照单变量线性回归练习中要求,绘制成本的变化曲线。
###在这里填入代码###
data2.insert(0, 'Ones', 1)
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]

X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta = np.matrix(np.array([0,0,0]))

w2_final, cost2_final = gradientDescent(X2, y2, theta.T, alpha, iterations)

print('The weight vector:\n',w2_final)
computeCost(X2, y2, w2_final)
 
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iterations), cost2_final, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Iterations')

    The weight vector:
     [[-1.00309831e-16]
     [ 8.84042349e-01]
     [-5.24551809e-02]]





    Text(0.5, 1.0, 'Error vs. Iterations')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IMX6ULL驱动开发学习】09.Linux驱动之GPIO中断(附SR501人体红外感应驱动代码)

Linux驱动的GPIO中断编程主要有以下几个步骤&#xff1a; 1、 通过GPIO号获取软件中断号 (中断编程不需要设置GPIO输入输出&#xff0c;当然申请GPIO&#xff0c;设置输入也没问题) int gpio_to_irq(unsigned int gpio)参数含义gpioGPIO引脚编号 2、 注册中断处理函数&#…

k8s中docker0默认ip修改

原因&#xff1a; 由于ip冲突&#xff0c;必须要修改docker0的默认ip 过程&#xff1a; &#xff08;1&#xff09;修改文件 /etc/docker/daemon.json 添加内容 “bip”: “ip/netmask” [ 切勿与宿主机同网段 ] &#xff08;2&#xff09; &#xff08;3&#xff09;重启docke…

视觉SLAM十四讲——ch9实践(后端1)

视觉SLAM十四讲——ch9的实践操作及避坑 0.实践前小知识介绍0.1 数据集的使用 1. 实践操作前的准备工作2. 实践过程2.1 Ceres BA2.2 g2o求解BA 3. 遇到的问题及解决办法3.1 查看.ply文件时报警告 0.实践前小知识介绍 0.1 数据集的使用 Ceres BA使用的是BAL数据集。在本例中&a…

为什么说2023年最难招聘的岗位是高性能计算工程师?

随着毕业季的临近&#xff0c;高校毕业生将进入就业关键阶段。据统计&#xff0c;2023届全国高校毕业生预计达到1158万人&#xff0c;同比增加82万人&#xff0c;再创新高。尽管有千万的大学毕业生&#xff0c;但是企业反馈依然很难招聘到合适的高性能计算工程师。 这主要归因于…

看到就赚到的5款小众软件

今天推荐5款十分小众的软件&#xff0c;知道的人不多&#xff0c;但是每个都是非常非常好用的&#xff0c;有兴趣的小伙伴可以自行搜索下载。 图文识别——PandaOCR PandaOCR是一款用于识别和转换图片中的文字的工具。它可以让你对任何格式的图片进行文字识别&#xff0c;并输…

STM32速成笔记—按键检测

如果需要本文程序工程&#xff0c;请评论区留邮箱或者私信。 文章目录 一、按键检测原理二、硬件连接三、程序设计3.1 初始化GPIO3.2 按键扫描函数 四、按键控制LED4.1 初始化LED和KEY的GPIO4.2 编写按键扫描函数4.2 编写LED控制函数4.3 编写按键服务函数 五、拓展5.1 一个按键…

如何使用二维码实现配电箱巡检

施工工地的外部环境条件恶劣,加之工地上机动车辆的运行和机械设备的应用&#xff0c;均易导致电气故障的发生。现场配电箱缺乏专业技术人员的管理,易造成触电伤害、火灾等事故。现场纸质巡检存在以下问题&#xff1a; 1、信息查询不便:配电箱信息、负责人&#xff0c;历史巡检维…

Flowable服务组件-扩展组件

Flowable服务组件-扩展组件 扩展组件 文章目录 Flowable服务组件-扩展组件前言Flowable给我们提供了非常丰富的组件&#xff0c;但是在实际场景中&#xff0c;我们有需要企业个性化的组件&#xff0c;如何扩展自己的组件至关重要 一、扩展微服务回调组件二、程序步骤1.定义我们…

618父亲节,感恩的祝福送给父亲!

父亲节&#xff08;Fathers Day&#xff09;&#xff0c;是感恩父亲的节日。Fathers day, is a day of thanksgiving for fathers. 第一个提出父亲节理念的人是1906年的多德夫人。她想用一个特殊的日子来纪念她的父亲&#xff0c;她的妈妈多年前就去世了。起初&#xff0c;多德…

1.4 场效应管

1.什么是场效应管&#xff1f; 场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是一种基于电场效应调控电流的三端器件。它是一种用于电子电路中的重要元件&#xff0c;常用于放大信号、开关电路和模拟电路等应用。 场效应管主要由一个导电的沟…

git 的详细介绍使用

点击下载&#xff1a;Git下载地址 下载完成后在本地文件夹空白位置右键能看到即为安装成功 git简介&#xff1a;git是一个版本控制系统&#xff0c;见下方图详解 快速查看git的全局配置项 git config --list --global 查看指定的全局配置项 git config user.name git conf…

【Git删除大文件失败,提示WARNING: Ref ‘refs/heads/master‘ is unchanged的解决思路】

1. 问题描述 最近使用Gitee一直在独立开发某个项目&#xff0c;某次因为某个测试文件比较大&#xff0c;超过了100MB&#xff0c;gitee无法接受&#xff0c;上传失败。但是当时我没有发现上传失败&#xff0c;就没有处理&#xff0c;等到今天发现的时候&#xff0c;已经提交过…

Low-Light Image Enhancement with Wavelet-based Diffusion Models

Abstract 扩散模型在图像恢复任务中取得了很好的效果&#xff0c;但存在时间长、计算资源消耗大、恢复不稳定等问题。为了解决这些问题&#xff0c;我们提出了一种鲁棒和高效的基于扩散的微光图像增强方法&#xff0c;称为DiffLL。具体来说&#xff0c;我们提出了一个基于小波…

Vulnhub靶机:ME AND MY GIRLFRIEND_ 1

目录 介绍信息收集主机发现主机信息探测 网站探测SSH爆破 & 提权 介绍 系列&#xff1a;Me and My Girlfriend&#xff08;此系列共1台&#xff09; 发布日期&#xff1a;2019 年 12 月 13 日 难度&#xff1a;初级 运行环境&#xff1a;VMware 目标&#xff1a;取得 root…

Linux——MySQL数据库部署及自建数据库mysql-yum仓库

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

如何有效提升英文口语水平?这 15 个方法值得学习!

要提升英文口语水平&#xff0c;除了多说多练&#xff0c;还有很多方法可以尝试。下面&#xff0c;小编为大家整理了15个有效的方法&#xff0c;让你说英语更自信流利&#xff01; Record yourself speaking English and listen back to your pronunciation and intonation, i…

Docker:启动,停止

1.启动一个容器&#xff1a; docker run 可选参数 镜像名 [COMMAND] [ARG...] docker run -it ubuntu /bin/bash &#xff0c;启动一个使用ubuntu的docker&#xff0c;并使用/bin/bash做为dcoker中执行的命令。 其中818d5a1c32ac为容器ID 在宿主机上&#xff0c;可以通过docke…

Citespace软件基础应用

CiteSpace软件是Citation Space的简称&#xff0c;可以译为“引文空间”&#xff0c;由美国德雷赛尔大学计算机与情报学教授陈超美博士基于Java语言开发、基于引文分析理论的信息可视化软件。 它是一款分析科学文献中蕴含的潜在知识&#xff0c;并在科学计量学、数据和信息可视…

【Git原理与使用】-- 初步认识

目录 Git版本控制器的引入 版本控制器 Git安装&#xff08;已安装可以跳过&#xff09; Linux-centos Linux-ubuntu Git基本操作 创建Git本地仓库 配置 Git 认识工作区、暂存区、版本库 工作区、版本库 stage暂存区 工作区内容使用Git管理 Git版本控制器的引入 #&…

4端到端协议-4.3【实验】【计算机网络】

4端到端协议-4.3【实验】【计算机网络】 前言推荐4端到端协议4.2 TCP协议流捕获与TCP协议分析4.3 TCP连接管理实验目的实验内容及实验环境实验原理TCP连接管理的三个阶段TCP的连接建立TCP连接建立时的各状态TCP的数据传输TCP 的连接释放为什么A 必须等待 2MSL 的时间&#xff1…