机器学习 | 实验一:线性回归

news2024/11/16 19:28:05

文章目录

  • 📚描述
  • 📚数据
  • 📚监督学习问题
  • 📚二维线性回归
  • 📚理解J(θ)

⭐️对应笔记

  • 单变量线性回归
  • 多变量线性回归

📚描述

第一个练习将提供线性回归练习。这些练习已经在Matlab上进行了广泛的测试。但它们也应该在中工作,这被称为“Matlab的免费版本”。如果您使用的是Octave,请确保安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。

📚数据

数据包里包含了一些测量2到8岁之间不同男孩身高的例子。y值是以米为单位测量的高度x值是与身高对应的男孩的年龄。每个身高和年龄元组在我们的数据集中构成了一个训练示例 ( x ( i ) , y ( i ) ) (x ^{(i)},y ^{(i)}) (x(i)y(i))。有m = 50个训练示例,我们用它们来开发一个线性回归模型。

📚监督学习问题

在这个问题中,我们使用梯度下降来实现线性回归。在Matlab/Octave中,我们可以使用这些命令加载训练集

x=load('ex1x.dat');
y=load('ex1y.dat');

这将是我们针对具有n=1特征的监督学习问题的训练集(除了通常的 x 0 = 1 x_0 = 1 x0=1,所以 x ∈ R 2 x∈R_2 xR2)。用以下命令绘制训练集(并标记轴)

figure %open a new figure window(%是注释)
plot(x,y,'o');
ylabel('Height in meters')
xlabel('Age in years')

我们能看到一系列如下的数据点
在这里插入图片描述
在开始梯度下降之前,我们需要向每个示例中添加 x 0 = 1 x_0 = 1 x0=1

m=length(y);%store the number of training examples(这里的m是约定符号)
x=[ones(m,1),x];%Add a column of ones to x

从这一点开始,我们需要记住,训练数据的年龄值实际上在x的第二列。这在以后绘制结果时很重要。

📚二维线性回归

现在,我们将对这个问题实现线性回归。回想一下,线性回归模型是 h θ ( x ) = θ T X h_\theta(x)=\theta^TX hθ(x)=θTX,并且现在这种情况是 θ 0 + θ 1 x 1 \theta_0+\theta_1x_1 θ0+θ1x1。而梯度下降更新规则为:在这里插入图片描述

(1) 使用α = 0.07学习率实现梯度下降。将参数初始化 θ 0 = θ 1 = 0 θ_0 = θ_1 = 0 θ0=θ1=0,并从这个初始起点运行一次梯度下降的迭代。记录第一次迭代后得到的 θ 0 θ_0 θ0 θ 1 θ_1 θ1的值

alpha=0.07;%learning rate
%initial theta
theta0=0;
theta1=0;

%after one iteration
theta0=theta0-alpha*(1/m)*sum((theta0.*x(:,1)+theta1.*x(:,2)-y).*x(:,1));
theta1=theta1-alpha*(1/m)*sum((theta0.*x(:,1)+theta1.*x(:,2)-y).*x(:,2));

👇得到第一次迭代后 θ 0 θ_0 θ0 θ 1 θ_1 θ1的值👇

在这里插入图片描述

(2) 继续运行梯度下降,进行更多的迭代,直到θ收敛(这总共需要大约1500次迭代)。收敛后,记录得到的 θ 0 θ_0 θ0 θ 1 θ_1 θ1的最终值,并根据θ在与训练数据相同的图上绘制算法的直线拟合。绘图命令将如下所示:

theta0(1,1)=0.074528;
theta1(1,1)=0.3543;
maxlter=1500;%max iteration
for i=1:maxlter-1
	theta0(i+1,1)=theta0(i,1)-alpha*(1/m)*sum((theta0(i,1).*x(:,1)+theta1(i,1).*x(:,2)-y).*x(:,1));
	theta1(i+1,1)=theta1(i,1)-alpha*(1/m)*sum((theta0(i,1).*x(:,1)+theta1(i,1).*x(:,2)-y).*x(:,2));
end
hold on;%plot new data without clearing old plot
plot(x(:,2),theta0(i+1,1)+x(:,2)*theta1(i+1,1),'-');
legend('Training data','Linear regression');

在这里插入图片描述

迭代1500次后, θ 0 θ_0 θ0=0.75015, θ 1 θ_1 θ1=0.063883。

⚠️在这里我们提前预知了大致的迭代次数,当我们不能提前预知时,我们可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。

在这里插入图片描述

⚠️也有一些自动测试是否收敛的方法,例如将代价函数的变化值与某个阀值(例如 0.001)进行比较。

👀从变量编辑器中看到,趋于收敛时,迭代后值基本就不变了

在这里插入图片描述

注意,对于大多数机器学习问题,x是非常高维的,所以我们不能绘制 h θ ( x ) h_θ(x) hθ(x)。但是因为在这个例子中,我们只有一个特性,如果能够绘制出来,我们的结果就会得到一个很好的完整性检查。

(3) 最后,我们用学习到的假设来做一些预测。用所得到的模型来预测两个3.5岁和7岁的男孩的身高。

  • 已知假设函数大致为: 0.7501 + 0.0639 x 0.7501+0.0639x 0.7501+0.0639x
  • 3.5岁: θ 0 + 3.5 θ 1 = 0.7501 + 3.5 × 0.0639 = 0.9738 m \theta_0+3.5\theta_1=0.7501+3.5×0.0639=0.9738m θ0+3.5θ1=0.7501+3.5×0.0639=0.9738m
  • 7岁: θ 0 + 7 θ 1 = 0.7501 + 7 × 0.0639 = 1.1974 m \theta_0+7\theta_1=0.7501+7×0.0639=1.1974m θ0+7θ1=0.7501+7×0.0639=1.1974m

📚理解J(θ)

我们想更好地了解梯度下降所做的事情,并可视化参数 θ ∈ R 2 θ∈R^2 θR2 J ( θ ) J(θ) J(θ)之间的关系。在这个问题中,我们将把 J ( θ ) J(θ) J(θ)绘制为一个三维曲面图。

在这里插入图片描述

在这里插入图片描述

当应用学习算法时,我们通常不会尝试绘制 J ( θ ) J(θ) J(θ),因为通常 θ ∈ R n θ∈R^n θRn是非常高维的,所以我们没有任何简单的方法来绘制或可视化 J ( θ ) J(θ) J(θ)。但是因为这里的例子使用了一个非常低维的 θ ∈ R 2 θ∈R^2 θR2,我们将绘制 J ( θ ) J(θ) J(θ)来获得更多关于线性回归的直觉。

%以下代码中的参数为指导书指定
J_vals=zeros(100,100); 
theta0_vals=linspace(-3,3,100);
theta1_vals=linspace(-1,1,100);
% linespace(x1,x2,N)中,x1、x2、N分别为起始值、终止值、元素个数。
for i=1:length(theta0_vals)
 	for j=1:length(theta1_vals)
		t=[theta0_vals(i);theta1_vals(j)];
  		J_vals(i,j)=(0.5/m)*(x*t-y)'*(x*t-y);
 	end
end
J_vals = J_vals'; %转置
figure;
surf(theta0_vals,theta1_vals,J_vals);
xlabel('\theta_0');
ylabel('\theta_1');

在这里插入图片描述

这个3D曲面和实现梯度下降时发现的θ0和θ1值之间的关系是什么

这个3D曲面的最低点所对应的 θ 0 θ_0 θ0 θ 1 θ_1 θ1就是所求的假设函数对应的 θ 0 θ_0 θ0 θ 1 θ_1 θ1


扩展补充:surf函数

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

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

相关文章

Spring Boot @Aspect 切面编程实现访问请求日志记录

aop切面编程想必大家都不陌生了,aspect可以很方便开发人员对请求指定拦截层,一般是根据条件切入到controller控制层,做一些鉴权、分析注解、获取类名方法名参数、记录操作日志等。 在SpringBoot中使用aop首先是要导入依赖如下: …

软工2023个人作业二——软件案例分析

项目内容这个作业属于哪个课程2023年北航敏捷软件工程这个作业的要求在哪里个人作业-软件案例分析我在这个课程的目标是学习并掌握现代软件开发和项目管理技术,体验敏捷开发工作流程这个作业在哪个具体方面帮助我实现目标从软件工程角度分析比较我们所熟悉的软件&am…

Doris集成Spark读写的简单示例

Doris集成Spark读写的简单示例 文章目录Doris集成Spark读写的简单示例0、写在前面1、Spark Doris Connector介绍2、基本示例2.1 提前准备表和数据2.2 新建项目2.3 使用SQL方式进行读写2.3.1 代码2.3.2 相关Error2.4 使用DataFrame方式读写数据(**batch**&#xff09…

CS5261typec转HDMI|CS5260typec转VGA视频转换方案参考设计与PCB板开发

CS5261typec转HDMI|CS5260typec转VGA视频转换方案参考设计与PCB板开发 CS5261 CS5260分别是Type-C转HDMI或者VGA高性能 视频转换芯片,CS5261 是Type-C转HDMI 4K30HZ转换芯片 CS5260是Type-C转VGA 转换芯片。CS5261与CS5260两种芯片的功能和参数特性如下&#xff1…

热乎的面经——初出茅庐

⭐️前言⭐️ 本篇文章记录博主与2023.03.04面试上海柯布西公司,一面所被问及的面试问题,回答答案仅供参考。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获&am…

EdgeYOLO学习笔记

EdgeYOLO学习笔记 EdgeYOLO: An Edge-Real-Time Object Detector Abstract 本文基于最先进的YOLO框架,提出了一种高效、低复杂度、无锚的目标检测器,该检测器可以在边缘计算平台上实时实现。为了有效抑制训练过程中的过拟合,我们开发了一种…

git分支

分支什么是分支在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学…

DOM型XSS

DOM型XSSDOM是什么DOM型XSSDOM型XSS实操DOM是什么 DOM就是Document。 文档是由节点构成的集合&#xff0c;在DOM里存在许多不同类型的节点&#xff0c;主要有&#xff1a;元素节点、文本节点&#xff0c;属性节点。 元素节点&#xff1a;好比< body >< p >< h …

Go语言函数高级篇

Go语言函数高级篇1.高阶函数函数作为参数函数作为返回值2.匿名函数3.defer4.内置函数1.高阶函数 高阶函数分为函数作为参数和函数作为返回值两部分。 函数作为参数 函数可以作为参数&#xff1a; package mainimport "fmt"func add(x, y int) int {return x y }…

论文解析[11] CAT: Cross Attention in Vision Transformer

发表时间&#xff1a;2021 论文地址&#xff1a;https://arxiv.org/abs/2106.05786v1 文章目录摘要3 方法3.1 总体结构3.1.1 Inner-Patch Self-Attention Block3.1.2 Cross-Patch Self-Attention Block3.1.3 Cross Attention based Transformer结论摘要 使用图像patch来替换tr…

【Servlet篇4】cookie和session

在这一篇文章当中&#xff0c;我们提到了什么是cookie和session。 【网络原理8】HTTP请求篇_革凡成圣211的博客-CSDN博客HTTP的常见属性&#xff0c;URL&#xff0c;User-Agent&#xff0c;Refer,get 和post的区别https://blog.csdn.net/weixin_56738054/article/details/1291…

[数据集][VOC][目标检测]河道垃圾水面漂浮物数据集目标检测可用yolo训练-1304张介绍

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1304 标注数量(xml文件个数)&#xff1a;1304 标注类别数&#xff1a;1 标注类别名称:["trash"] …

如何从错误中成长?

在上一篇文章“技术人的犯错成本”里&#xff0c;我和你聊了技术人可能会犯的各式各样的错误&#xff0c;也举了很多例子&#xff0c;说明了技术人犯错的成本。在竞争激烈的互联网时代&#xff0c;试错当然是好事&#xff0c;但了解错误成本&#xff0c;避免不应该犯的错误&…

测试概念及模型

今日目标掌握测试用例包含的基本内容使用等价类方法设计出测试用例1. 软件测试分类&#xff08;复习&#xff09;1.1 按阶段划分单元测试测试&#xff1a;针对单个功能进行测试&#xff0c;如&#xff1a;登录、购物车等开发&#xff08;更多的理解&#xff09;&#xff1a;针对…

C/C++实现发送邮件功能(附源码)

C++常用功能源码系列 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务于工作实践。 专栏介绍:专栏讲本人近10年后端开发常用的案例,以高质量的代码提取出来,并对其进行了介绍。…

Linux -- 作业控制进程

作业控制 &#xff1a;官方 &#xff1a; 作业控制是一个命令行功能&#xff0c;允许一个shell 实例来运行和管理多个命令。作用 &#xff1a; 使用作业控制&#xff0c;可以选择性暂停&#xff0c;恢复&#xff0c;以及异步运行命令&#xff0c;让 shell 可以在子进程运行期…

【1599. 经营摩天轮的最大利润】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩…

基于flask+bootstrap+echarts+mysql的鱼村小馆订餐后台管理系统

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

[1.3.3]计算机系统概述——系统调用

文章目录第一章 计算机系统概述系统调用&#xff08;一&#xff09;什么是系统调用&#xff0c;有何作用&#xff08;二&#xff09;系统调用与库函数的区别&#xff08;三&#xff09;小例子&#xff1a;为什么系统调用是必须的&#xff08;四&#xff09;什么功能要用到系统调…

English Learning - L2-4 英音地道语音语调 双元音 [eɪ] [aɪ] [aʊ] [əʊ] [ɔɪ] 2023.03.2 周四

English Learning - L2-4 英音地道语音语调 双元音 [eɪ] [aɪ] [aʊ] [əʊ] [ɔɪ] 2023.03.2 周四节奏发音对比双元音概述双元音 [eɪ]发音技巧对应单词的发音对应句子的发音双元音 [aɪ]发音技巧对应单词的发音对应句子的发音双元音 [aʊ]发音技巧对应单词的发音对应句子的…