CG平台实验——线性回归

news2024/11/24 9:30:23

文章目录

  • 练习1:线性回归
    • 介绍
    • 1 实现简单示例函数
      • 1.1 提交解决方案
    • 2 单变量线性回归
      • 2.1 绘制数据
      • 2.2 梯度下降
        • 2.2.1 更新公式
        • 2.2.2 实现
        • 2.2.3 计算成本J(θ)
        • 2.2.4 梯度下降
      • 2.3 可视化成本函数
    • 选做练习
    • 3 多变量线性回归
      • 3.1 特征标准化
        • 3.2 梯度下降

练习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
a = np.eye(5)
a
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 绘制数据

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

# 引入所需要的库文件
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))
<matplotlib.axes._subplots.AxesSubplot at 0x23071e9d2e8>

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

2.2.3 计算成本J(θ)

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

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

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

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

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

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

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)
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.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
matrix([[-3.63029144,  1.16636235]])
# 计算最终的参数所得到的成本值
computeCost(X, y, g)
4.483388256587726
###在这里填入代码###
#对拟合曲线进行绘制
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')
Text(0.5, 1.0, 'Predicted Profit vs. Population Size')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RU5rI8t5-1685773080057)(output_15_1.png)]

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 = '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。
  • 请依照单变量线性回归练习中要求,绘制成本的变化曲线。
###在这里填入代码###
# add ones column
data2.insert(0, 'Ones', 1)

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

# 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)
0.13068670606095903
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')
Text(0.5, 1.0, 'Error vs. Training Epoch')

在这里插入图片描述

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

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

相关文章

chatgpt赋能python:Python在边框中写文字:优雅展示内容的方式

Python在边框中写文字&#xff1a;优雅展示内容的方式 当我们需要在网页上展示一些信息时&#xff0c;通常会使用边框来突出显示内容&#xff0c;然而&#xff0c;普通的边框可能会显得过于单调&#xff0c;缺少设计感&#xff0c;这时我们可以借助Python来实现一个功能强大的…

chatgpt赋能python:Python备份列表:从小白到大神,这里有你需要的一切

Python备份列表&#xff1a;从小白到大神&#xff0c;这里有你需要的一切 随着信息科技的发展&#xff0c;数字资料的价值越发具有现实意义&#xff0c;但是数据泄露、系统崩溃、病毒攻击、硬件故障等情况也时有发生。因此&#xff0c;对数据进行备份是非常必要的。Python作为…

Select选择器(antd-design组件库)简单使用以及增加搜索功能

1.Select选择器 下拉选择器。 2.何时使用 弹出一个下拉菜单给用户选择操作&#xff0c;用于代替原生的选择器&#xff0c;或者需要一个更优雅的多选器时。 当选项少时&#xff08;少于 5 项&#xff09;&#xff0c;建议直接将选项平铺&#xff0c;使用 Radio 是更好的选择。 组…

chatgpt赋能python:Python如何倒序输出列表

Python如何倒序输出列表 Python是一种高级编程语言&#xff0c;自由、开源、跨平台&#xff0c;被广泛用于Web开发、数据分析、机器学习等领域。在Python中&#xff0c;列表是一种常见的数据结构&#xff0c;它允许存储多个元素&#xff0c;并支持索引、切片等操作。本文将介绍…

chatgpt赋能python:Python如何保存文件-最全面的指南

Python如何保存文件 - 最全面的指南 Python是一种强大的编程语言&#xff0c;它在处理文本文件、CSV文件、Excel文件、图像文件和PDF文件等方面表现出色。然而&#xff0c;如何在Python中保存这些文件&#xff0c;对于初学者来说可能会有些棘手。在本篇文章中&#xff0c;我们…

自建极简Ethercat主站-底层驱动编写

1、简介 MECM&#xff08;Mini Ethercat Master&#xff09;,名字随便起的。已经学习了一段时间的Ethercat总线了&#xff0c;目前的想法就是自己简单实现一个Ethercat主站&#xff0c;没有太多的冗余功能&#xff0c;暂时不考虑太多的容错机制&#xff0c;仅实现目前用到的FO…

chatgpt赋能python:Python奇偶求和:简单实用的算法

Python奇偶求和&#xff1a;简单实用的算法 Python作为一门高级编程语言&#xff0c;不仅适用于数据分析及科学计算领域&#xff0c;也可用于日常生活中的实用问题。例如&#xff0c;人们常常需要对一个整数序列中的奇数和偶数进行求和&#xff0c;以便了解各自的总数或者对它…

【软件测试】测试经验:IT 软件测试技术系统化学习方法

目录 一、IT 软件测试技术的介绍 &#xff08;1&#xff09;相关职称证书 ① 「中级」软件评测师 ②「高级」项目管理师 &#xff08;2&#xff09;背景 &#xff08;3&#xff09;作用 &#xff08;4&#xff09;行业应用 &#xff08;5&#xff09;技术概况 二、…

ES数据库介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 前言 一、ES(ElasticSearch)是什么&#xff1f; 二、ES的使用场景 三、ES的特点 四、ES和传统数据库对比 总结 前言 今天项目通过python用到了ES数据库…

ubuntu22.04安装docker

1、卸载旧版本&#xff08;如果有的话&#xff09; sudo apt-get remove docker docker-engine docker.io containerd runc 2、 添加 Docker 的官方 GPG 密钥 curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 3、设置稳定版仓库 …

python+vue健身房会员管理系统97s0t

健身管理系统根据需求分析&#xff0c;分为多个角色模块&#xff0c;分别为普通管理员和超级管理员模块&#xff0c;其中健身俱乐部普通管理员和健身俱乐部超级管理员都可以使用&#xff0c;不同角色登录显示不同的权限功能。本健身房管理系统管理员&#xff0c;会员&#xff0…

二叉树part7 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

文章目录 530.二叉搜索树的最小绝对差思路代码困难 501.二叉搜索树中的众数思路官方题解代码困难 236. 二叉树的最近公共祖先思路代码困难 今日收获 530.二叉搜索树的最小绝对差 530.二叉搜索树的最小绝对差 思路 题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。…

51小车测速及OLED显示速度

1.小车测速 用途&#xff1a;广泛用于电机转速检测&#xff0c;脉冲计数,位置限位等。有遮挡&#xff0c;输出高电平&#xff1b;无遮挡&#xff0c;输出低电平接线 VCC 接电源正极3.3-5V GND 接电源负极 DO TTL开关信号输出 AO 此模块不起作用 测试原理和单位换算 轮子走一…

Springboot常见注解总结

给实体类使用该注解&#xff0c;结合后续的EXCEL工具类进行使用&#xff0c;能加快开发过程中关于文件导入的需求 文章目录 目录 前言 1. Excel注解 2. Annotation注解 3. Retention注解 4. Target注解 4. Document注解 5.Inherited注解 5.RestController注解 6.swagger注解(AP…

《10.21作业修正》

【一】 cookie概念解析&#xff1a;cookie是一种保存在客户端的小型文本文件&#xff0c;用于保存服务器通过set-cookie字段返回的数据&#xff0c;在下次请求服务器道德时候通过cookie字段将内容返回发送给服务器&#xff0c;是http进行客户端维护的一中方式&#xff0c;并且c…

Mycat中间件综合部署高可用-读写分离-分库分表(1.6)

Mycat中间件综合部署&#xff08;1.6&#xff09; 实施拓扑 一&#xff0c;环境搭建 1.服务分配 主机服务192.168.2.1MySQL-cluster-1192.168.2.2MySQL-cluster-2192.168.2.3Mycat 2.MySQL-cluster1分配 server-id端口角色13306master123307slave133308master243309slave2…

c语言中字符串比较的库函数是什么

说起比较运算&#xff0c;肯定第一时间想到了C语言中关于比较的相关运算符 “>、<、&#xff01;、>、<、”&#xff0c;那么要比较两个字符串是否相等是不是直接用“”比较就行了。下面就来看看这种方法行不行&#xff1f; 先看一个例子 void main( void ) {cha…

chatgpt赋能python:Python中如何使用局部变量

Python中如何使用局部变量 Python是一种高级编程语言&#xff0c;它是一种解释型语言&#xff0c;因此它的速度可能不如C 或Java等编译型语言快&#xff0c;但是Python的语法简洁&#xff0c;易于阅读和编写&#xff0c;并且具有强大的功能。 在Python中&#xff0c;变量是一…

SAP VK11税码的理解

背景:销售订单税率获取逻辑 1.工厂&#xff0c;工厂定义维护了国家代码信息 (SO–工厂–国家代码) 2.客户主数据通用数据维护了国家代码 (SO-客户–国家代码) 3.客户主数据销售数据维护了国家代码对应的税分类&#xff08;此国家代码由销售组织对应国家代码维护的国家代码带出来…

DAY08_JavaScript

目录 1 JavaScript简介2 JavaScript引入方式2.1 内联脚本2.2 内部脚本2.3 外部脚本 3 JavaScript基础语法3.1 书写语法3.2 输出语句3.3 变量3.4 数据类型3.5 运算符3.5.1 \和区别3.5.2 类型转换 3.6 流程控制语句3.6.1 if 语句3.6.2 switch 语句3.6.3 for 循环语句3.6.4 while …