验证性实验 - 线性回归

news2024/11/15 13:52:38

练习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 提交解决方案

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

In [1]:

###在这里填入代码###
import numpy as np
a = np.eye(5)
a

Out[1]:

array([[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 绘制数据

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

In [2]:

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

%matplotlib inline

In [3]:

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

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

#查看数据的前五条
data.head(5)

Out[3]:

PopulationProfit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233

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

要点:

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

In [4]:

###在这里填入代码###
data.plot(kind='scatter', x='Population', y='Profit',c='red', figsize=(12,8))

Out[4]:

<matplotlib.axes._subplots.AxesSubplot at 0x23071e9d2e8>

在这里插入图片描述

2.2 梯度下降

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

2.2.1 实现

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

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

In [5]:

#在列索引为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.2 计算成本J(θ)

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

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

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

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

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

In [6]:

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

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

theta = np.matrix(np.array([0,0]))
computeCost(X, y, theta)

Out[6]:

32.072733877455676

2.2.3 梯度下降

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

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

请记住,成本𝐽(𝜃)为参数-被向量𝜃终止,而不是𝑋和𝑦。也就是说,我们将𝐽(𝜃)的值最小化通过改变矢量𝜃的值,而不是通过改变𝑋或𝑦。

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

要点:

实现梯度下降后,需要使用最终的参数值将线性回归的拟合结果进行可视化

In [7]:

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

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

g, cost = gradientDescent(X, y, theta, alpha, iterations)
g

Out[7]:

matrix([[-3.63029144,  1.16636235]])

In [8]:

# 计算最终的参数所得到的成本值
computeCost(X, y, g)

Out[8]:

4.483388256587726

In [9]:

###在这里填入代码###
#对拟合曲线进行绘制
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)

fig, ax = plt.subplots(figsize=(12,8))
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')

Out[9]:

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

在这里插入图片描述

2.3 可视化成本函数

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

In [10]:

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

Out[10]:

Text(0.5, 1.0, 'Error vs. Training Epoch')

在这里插入图片描述

选做练习


3 多变量线性回归

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

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

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

3.1 特征标准化

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

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

In [6]:

path = 'ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2.head() 

Out[6]:

SizeBedroomsPrice
021043399900
116003329900
224003369000
314162232000
430004539900

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

要点

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

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

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

In [7]:

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

Out[7]:

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 梯度下降

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

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

要点

  • 确保你的代码中可以支持任何大小的数据,并且数据均已被向量化。
  • 代码实现成本函数和梯度下降后,最终的成本值应大约为0.13。
  • 请依照单变量线性回归练习中要求,绘制成本的变化曲线。

In [16]:

###在这里填入代码###
# add ones column
# data2.insert(0, 'Ones', 1)

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


# set X (training data) and y (target variable)
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]

# convert to matrices and initialize theta
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta2 = np.matrix(np.array([0,0,0]))
alpha = 0.1
iterations = 1500 

# perform linear regression on the data set
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iterations)

# get the cost (error) of the model
computeCost(X2, y2, g2)

Out[16]:

0.13068648053904197

In [17]:

import matplotlib.pyplot as plt 
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iterations), cost2, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch') 

Out[17]:

Text(0.5, 1.0, 'Error vs. Training Epoch')

在这里插入图片描述

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

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

相关文章

马斯克撕下美国的遮羞布,美企纷纷背刺,外媒:可怕的还在后面

马斯克访华造成的影响还在持续&#xff0c;随着更多美国企业家访华以及表明态度&#xff0c;可以说他们正撕下美国的遮羞布&#xff0c;今天的美国其实早已背离了当初他们所宣扬的价值&#xff0c;凸显出外强中干的本质。 二.美国企业家纷纷访华撕下美国遮羞布 美国一直都标榜贸…

某购房通小程序解密分析【2023.6.17】

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 主要对小程序返回的加密结果进行解密的分析过程只…

如何在编程中中实现负载均衡和容错处理

什么是容错 容错是指系统&#xff08;计算机、网络、云集群等&#xff09;在其一个或多个组件发生故障时继续运行而不会中断的能力。 创建容错系统的目的是防止由单点故障引起的中断&#xff0c;确保任务关键型应用程序或系统的高可用性和业务连续性。 容错系统使用备份组件…

DAY26:回溯算法(一):回溯算法理论

课程链接&#xff1a;https://www.bilibili.com/video/BV1cy4y167mM/?spm_id_from333.788 什么是回溯法 回溯法 - OI Wiki (oi-wiki.org) 回溯法是一种经常被用在 深度优先搜索&#xff08;DFS&#xff09; 和 广度优先搜索&#xff08;BFS&#xff09; 的技巧。 其本质是…

Elasticsearch 基本使用(一)写入数据

写入数据 查询索引状态写入一条数据查询数据按id查询一条 类比 getById不按id查 写入官方测试数据 查询索引状态 GET _cat/indices写入一条数据 PUT/POST my_index/_doc/1 {"k": "test key" }my_index&#xff1a;索引名 _doc&#xff1a;文档类型&#…

css基础知识三:说说em/px/rem/vh/vw的区别?

一、介绍 传统的项目开发中&#xff0c;我们只会用到px、%、em这几个单位&#xff0c;它可以适用于大部分的项目开发&#xff0c;且拥有比较良好的兼容性 从CSS3开始&#xff0c;浏览器对计量单位的支持又提升到了另外一个境界&#xff0c;新增了rem、vh、vw、vm等一些新的计量…

2023年网络安全竞赛——网页渗透

网页渗透 任务环境说明:  服务器场景:Server2120  服务器场景操作系统:未知(封闭靶机)  用户名:未知 密码:未知 访问服务器的网站主页,猜测后台数据库中本网页中应用的库名称长度,将长度作为flag提交; 通过扫描发现靶机开放80端口,直接访问80 尝试输入一个1,…

Web安全信息收集之CMS指纹识别

1、CMS指纹识别 CMS(内容管理系统),又称整站系统或文章系统网站内容管理。用户只需要下载对应的CMS软 件包,部署搭建,就可以直接利用CMS,简单方便。但是各种CMS都具有其独特的结构命名规则和定 的文件内容,因此可以利用这些内容来获取CMS站点的具体软件CMS与版本 常见CMs: …

软件管理Linux

1. 获取程序包的途径 系统发行版的光盘或官方的服务器 http://mirrors.aliyun.comhttp://mirrors.sohu.comhttp://mirrors.163.com 项目官方站点第三方组织 Fedora-EPEL&#xff08;推荐&#xff09;搜索引擎&#xff1a; http://pkgs.org http://rpmfind.net http://rpm.pbon…

数据库第十章(数据库恢复技术)十一章(并发控制)

目录 1.事务 2.并发控制 1.事务 事务的特点&#xff1a;ACID 原子性 atom 一致性 consistent 隔离性 isolation 持久性 durable 故障的种类 1.事务内部故障 措施&#xff1a;采取redo重做和undo撤销技术 2.系统故障DBMS 措施&#xff1a;重启 3.介质故障 硬件损坏 4.计…

msvcr110.dll丢失的解决方法-dll一键下载修复

我们在运行软件程序或者游戏的时候&#xff0c;如果程序提示“无法启动此程序&#xff0c;因为计算机中丢失msvcr110.dll。尝试重新安装该程序以解决此问题”&#xff0c;如果说明您电脑系统中缺少或者未注册msvcr110.dll这个运行库文件&#xff0c;那么我们要如何解决这个问题…

大学生简历信息填写模板

大学生简历信息填写模板篇1 姓名&#xff1a;__性别&#xff1a;_年龄&#xff1a;22健康状况&#xff1a;良好 籍贯&#xff1a;__家庭背景&#xff1a;职工家庭 所学专业&#xff1a;市场营销学历&#xff1a;本科(在读) 参业意向&#xff1a;可从事文秘工作、贸易、产品营销…

pytorch神经网络及训练(一)

pytorch神经网络及训练&#xff08;一&#xff09; 随机梯度下降算法 随机梯度下降算法&#xff08;SGD&#xff09;是对梯度下降算法的一种改进。 直观上SG的方法可能效率上更优。考虑这样一个情况&#xff0c;我们的训练数据集合 是由小的数据 集合复制10份得到的。此时&…

Java代码规范的重要性

目录 1 为什么需要代码规范1.1 不规范的案例1.1.1 就因为忘记加个分号&#xff0c;整个程序都崩溃了1.1.2 我为什么没写注释&#xff1f;1.1.3 谁动了我的代码&#xff1f;1.1.4 半小时写的代码&#xff0c;花两个小时调试 1.2 代码编写1.3 在项目架构1.4 数据库设计1.5 编写文…

openpnp - 软件版本的更新记录(机器翻译)

文章目录 openpnp - 软件版本的更新记录(机器翻译)概述openpnp更新历史记录机翻了一个版本, 大概齐参考一下.END openpnp - 软件版本的更新记录(机器翻译) 概述 卡在底部相机矫正上, 底部相机的硬件安装已经很精确了, 基本能排除是硬件问题. 现在问题定位, 大概率是openpnp软…

g++ -v 若显示g++不是内部或外部命令`

MinGW - Minimalist GNU for Windows Files下载地址 下载地址点这里https://sourceforge.net/projects/mingw/files/ . exe文件下载后建议安装在D盘下tools文件夹下&#xff08;个人习惯&#xff09; 此次安装在默认路径下&#xff0c;直接傻瓜式安装 安装&#xff1a; 1.…

2023年网络安全竞赛——网络安全应急响应Server2228

网络安全应急响应 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2228&#xff08;开放链接&#xff09; 用户名&#xff1a;root&#xff0c;密码&#xff1a;pssw0rd123 1. 找出被黑客修改的系统别名&#xff0c;并将倒数第二个别名作为Flag值提交&#xff1b…

CTFshow-pwn入门-前置基础pwn13-pwn19

pwn13 题目说编译运行这个flag.c文件即可获得flag。那我们先把flag.c文件下载下来&#xff0c;然后托到虚拟机里使用gcc编译一下&#xff0c;运行看看是否能够拿到flag。 gcc -o flag -flag.c ./flagok&#xff0c;果然拿到了flag。flag为&#xff1a;ctfshow{hOw_t0_us3_GCC?…

前端小练-平台首页介绍+动画

文章目录 前言结构头部外部容器文字 主体小球动画打字机动画特效实现监控 完整代码总结 前言 时间飞逝&#xff0c;快大四了&#xff0c;刚好最近看不下去考研的&#xff0c;而且要准备这个毕设选题了&#xff0c;然后就想着怎么能够把自己所学的东西都用上&#xff0c;一开始…

Vue H5项目如何在PC端时布局居中展示,而不全屏拉伸

目录 1、场景再现&#xff1a;在PC端时 H5项目布局被拉伸2、代码实现3、最终效果图4、疑惑 1、场景再现&#xff1a;在PC端时 H5项目布局被拉伸 2、代码实现 在App.vue中的写入&#xff0c;vue2 的在mounted中写入&#xff0c;vue3的写在onMounted写入。 逻辑讲解&#xff1a…