机器学习 | 实验四:正则化

news2024/9/25 0:39:08

⭐对应笔记:正则化

📚描述

在这个练习中,你将实现正则化的线性回归和正则化的逻辑回归。

📚数据

这个数据包包含两组数据,一组用于线性回归,另一个用于逻辑回归。还包含一个名为"map_feature"的辅助函数,将用于逻辑回归。确保这个函数的m文件位于您计划编写代码的相同工作目录中。

📚正则化线性回归

本练习第一部分着重于正规线性回归和正规方程。加载数据文件"ex5Linx.dat"和"ex5Liny.dat",这对应你要开始的变量x和y。注意,在这个数据中,输入"x"是一个单独的特征,因此你可以将y作为x的函数绘制在二维图上:

x=load('ex5Linx.dat');
y=load('ex5Liny.dat');
figure
plot(x,y,'o');

在这里插入图片描述

从这个图上可以看出来,拟合直线可能过于简单。相反,我们将尝试对数据拟合一个高阶多项式,以捕捉更多点的变化。我们试试五阶多项式。我们的假设是:

在这里插入图片描述

这意味着有六个特征的假设,因为 x 0 , x 1 , . . . , x 5 x_0,x_1,...,x_5 x0,x1,...,x5都是我们回归的所有特征。注意,即使我们得到了一个多项式拟合,我们仍有一个线性回归的问题,因为假设在每个特征中都是线性的。


由于我们正在将一个五阶多项式拟合到一个只有7个点的数据集上,因此很可能会发生过拟合。为了防止这种情况发生,我们将在模型中使用正则化。回想一下,在正则化问题中,目标是最小化以下关于θ的成本函数:

在这里插入图片描述

式中,λ为正则化参数。正则化参数λ是对拟合参数的控制。随着拟合参数大小的增加,对代价函数的惩罚也会增加。这个惩罚取决于参数的平方以及λ的大小。另外,请注意,λ求和不包括 θ 0 2 θ_0^2 θ02


现在,我们将使用正规方程找到模型的最佳参数。回想一下正则化线性回归的正规方程解是:

在这里插入图片描述

跟在 λ后的矩阵是一个左上角一个0和剩余对角线元素为1的对角(n+1)×(n+1)矩阵(记住,n是特征的数量)。向量 y和矩阵 X 对于非正则回归有相同的定义。使用这个方程,找出使用以下三个正则化参数 θ 的值: λ=0λ = 1λ = 10

当你实现你的程序时,请记住, X 是一个 m × ( n + 1 ) 矩阵,因为有m个训练样本和 n个特征,加上一个 x 0 = 1 x_0 = 1 x0=1的截距项。在提供给这个练习的数据中,你只是给出 x的一次方。你需要在你的向量 X中给出其它 x的平方,这意味着 X的第一列都是1,第二列是 x的一次方,第三列是 x的二次方,依次进行下去。可以使用以下命令:

x = [ones(m,1),x,x.^2,x.^3,x.^4,x.^5];
x = load('ex5Linx.dat');
y = load('ex5Liny.dat');
figure
plot(x,y,'o');
hold on

m = length(y);
x = [ones(m,1),x,x.^2,x.^3,x.^4,x.^5];
theta = zeros(6,3);
T = diag([0 1 1 1 1 1]);
lamda = [0,1,10];
for i = 1:3
    theta(:,i) = inv(x'*x+lamda(i)*T)*x'*y;
end

x = linspace(-1,1,100)';
x = [ones(100,1),x,x.^2,x.^3,x.^4,x.^5];
plot(x(:,2), x*theta(:,1),'--r');
hold on
plot(x(:,2), x*theta(:,2),'--b');
hold on
plot(x(:,2), x*theta(:,3),'--g');
hold on
legend('Training Data','lamda = 0','lamda = 1','lamda = 10');

在这里插入图片描述

⭐通过查看这些图表,您可以得出关于正则化参数λ如何影响您的模型的什么结论?

  • λ = 0的时候曲线会出现过拟合现象,而 λ = 0 对应的是非正则化的线性回归。对比 λ = 1 和 λ = 10,会发现 λ = 10时曲线偏离数据点比较严重,即发生了欠拟合现象。
  • λ越大,曲线拟合效果越差。当 λ 比较小时,惩罚太小,导致曲线的过拟合度依旧很高;随着 λ 的值增大,拟合出来的曲线会渐渐波动性下降,同时在训练集上的拟合度会稍有下降,但会防止过拟合现象的发生;如果 λ 太大,会导致曲线最后无限逼近于常数项系数θ ,成为一条平稳的直线,以至于欠拟合

📚正则化逻辑回归

在本练习的第二部分中,您将使用牛顿法实现正则化的逻辑回归。首先,将文件“ex5Logx.dat”和“ex5Logy.dat”加载到程序中。该数据集表示具有两个特征的逻辑回归问题的训练集。为了避免以后的混淆,我们将把包含在“ex5Logx.dat”中的两个输入特性称为u和v。所以在“ex5Logx.dat”文件中,第一列数字代表特征u,你将在横轴上绘制,第二个特征代表v,你将在纵轴上绘制。加载数据后,使用不同的标记绘制点,以区分两种分类。

x = load('ex5Logx.dat');
y = load('ex5Logy.dat');
figure
%Find the indices for the 2 calsses
pos = find(y == 1); neg = find(y == 0);
plot(x(pos,1),x(pos,2),'+');
hold on
plot(x(neg,1),x(neg,2),'o');

在这里插入图片描述

我们现在将对这个数据拟合一个正则化的回归模型。回想一下,在逻辑回归中,假设函数是:

在这里插入图片描述

在这个练习中,我们将把x赋值为u和v的所有单项式(即多项式3项),直到第六次幂:

在这里插入图片描述

为了澄清这个符号:我们做了一个28个特征向量x,其中 x 0 = 1 , x 1 = u , x 2 = v , … … x 28 = v 6 x_0 = 1,x_1 = u,x_2 = v,……x_{28}=v^6 x0=1,x1=u,x2=v,……x28=v6。记住,u是“ex5Logx.dat”文件中数字的第一列,而v是第二列。从现在开始,我们将只把x的条目称为 x 0 , x 1 x_0,x_1 x0,x1等等,而不是它们的u和v的值。

为了避免枚举所有 x 项的麻烦,我们包含了一个辅助函数,“map_feature”,它将原始数据映射到特征向量。这个函数使用于单个训练示例,也适用于整个训练示例。为了使用这个函数,将"map_feature.m"放在你的工作目录中

x = map_feature(u,v)

这假设这两个原始特征被存储在名为“u”和“v”的列向量中。如果只有一个训练示例,每个列向量将是一个标量。该函数将输出一个存储在变量“x”中的新特性数组。当然,您可以为参数和输出使用任何您想要的名称。只要确保你的两个参数是相同大小的列向量。

在建立这个模型之前,回想一下我们的目标是最小化正则化逻辑回归的最小代价函数:

在这里插入图片描述

这看起来像是非正则化逻辑回归的成本函数,除了在最后有一个正则化项。我们现在将用牛顿的方法来最小化这个函数。回想一下,牛顿方法的更新规则是:

在这里插入图片描述

这与非正则化逻辑回归的规则相同。但是因为你现在正在实现正则化,梯度∇θ(J)和Hessian H有不同的形式:

在这里插入图片描述

如果你把 λ = 0 代入这些表达式,您将看到和非正则化逻辑回归有相同的公式,在这些公式中:

  • x ( i ) x^{(i)} x(i)是你的特征向量,在这个练习中这是一个28×1的向量。
  • ∇ θ J ∇_θJ θJ是28×1的向量。
  • x ( i ) ( x ( i ) ) T x^{(i)}(x^{(i)})^T x(i)(x(i))T是28×28的矩阵。
  • y ( i ) y^{(i)} y(i) h θ ( x ( i ) ) h_θ ( x ^{( i )} ) hθ(x(i))是标量。
  • λ/m后面的矩阵在海森公式中是一个左上角一个0和剩余对角线元素为1的对角28×28矩阵。

现在在这个数据集上使用如下的 λ值运行牛顿法:λ=0λ = 1λ = 10

打印每次迭代中的 J ( θ ) J ( θ ) J(θ) 值,为了确定牛顿法是否已经收敛。 J ( θ ) J ( θ ) J(θ) 不应该在使用牛顿法中的任何时候都减少,如果是,检查你是否正确定义了 J ( θ ) J ( θ ) J(θ) ,还要检查梯度和海森的定义,以确保正则化部分没有错误。

收敛后,用θ的值找出分类问题中的决策边界。决策边界定义为其中的直线

在这里插入图片描述

x = load('ex5Logx.dat');
y = load('ex5Logy.dat');
figure
pos = find(y); neg = find(y == 0);
plot(x(pos, 1), x(pos, 2), '+');
hold on;
plot(x(neg, 1), x(neg, 2), 'o');
u = x(:, 1); v = x(:, 2);
x = map_feature(u, v);
m = length(y);

lamda = 10; %lamda修改处
g = inline('1.0 ./ (1.0 + exp(-z))');
T = eye(28, 28); T(1, 1) = 0;
theta = zeros(28, 1);
EPS = 10^-6;
h = g(x * theta);
L(1) = 0;
L(2) = (1 / m) .* sum(-y .* log(h) - (1 - y) .* log(1 - h));
cnt = 2;
while abs(L(cnt) - L(cnt - 1)) > EPS
    cnt = cnt + 1;
    H = (1 / m) .* x' * diag(h) * diag(1 - h) * x + (lamda / m) * T;
    theta_j = theta; theta_j(1, 1) = 0;
    theta = theta - H \ ((1 / m) * x' * (h - y) + (lamda / m) * theta_j);
    h = g(x * theta);
    L(cnt) = (1 / m) .* sum(-y .* log(h) - (1 - y) .* log(1 - h)) + (lamda / (2 * m)) * sum(theta .* theta);
end

hold on
u = linspace(-1, 1.5, 200);
v = linspace(-1, 1.5, 200);
z = zeros(length(u), length(v));
for i = 1:length(u)
    for j = 1:length(v)
        z(j, i) = map_feature(u(i), v(j)) * theta;
    end
end
z = z';
contour(u, v, z, [0, 0], 'LineWidth', 2);
figure;
plot(1:cnt - 1, L(2: cnt), 'o-')
norm(theta)
  • 首先将原始的特征向量 x x x 映射到高维特征向量 m a p _ f e a t u r e ( u , v ) map\_feature(u,v) map_feature(u,v),然后利用逻辑回归分类器的梯度下降算法来拟合训练数据集,其中 l a m d a lamda lamda 是正则化系数。在拟合过程中,使用了代价函数 L L L,它包含了正则化项,并且 H H H L L L 的 Hessian 矩阵,用于计算参数 θ \theta θ 的梯度方向。
    • g函数为逻辑函数(sigmoid函数),T为28x28的单位矩阵且将T的第一个元素设为0,`theta初始为28x1的零向量,EPS为精度要求(代价函数的值与上一次变化量不超过所设定的EPS,那么就认为模型已经收敛,跳出while循环)。
    • 在while循环里,用已知的theta来计算模型预测值h。L(1)为0,L(2)为初始代价函数的值,然后用while循环不断更新theta并计算代价函数的值,直至代价函数不再变化或达到精度要求。更新theta是通过计算Hessian矩阵H的逆矩阵乘上梯度的方式实现的
    • 牛顿迭代法的核心在于求解Hessian矩阵的逆矩阵,将其乘上梯度得到参数的更新量。Hessian矩阵在逻辑回归中的具体定义是,在所有训练样本上的损失函数的二阶偏导数组成的矩阵。梯度是指代价函数对参数的偏导。
  • 最后,通过画出分类边界图和代价函数的迭代过程来观察模型是否收敛以及代价函数的变化情况。norm(theta)则求解theta每个元素的平方和并返回值。

⭐️下图表示Grid 图与决策边界损失函数与迭代次数关系

λ=0

在这里插入图片描述

λ=1

在这里插入图片描述

λ=10

在这里插入图片描述

⭐️λ如何影响结果?

从以上三张图可以看出惩罚越大,其精度、查准率和查全率越低,曲线会逼近于正则化项的圆形边界,但收敛速度会越快。对比λ取0、1、10的情况,某种程度上说,λ=1是比较合适的,既保证了精度、查准率和查全率相对较高,又提高了模型的泛化能力,一定程度上缓解了过拟合。

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

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

相关文章

Win11快速打开便签和使用技巧分享

Win11快速打开便签和使用技巧分享。Win11系统中为用户提供了一个非常实用的系统组件,就是便签功能,使用这个功能可以帮助我们便捷的进行一些重要内容的记录。那么如何去开启开启这个程序来使用呢?来看看以下的详情分享吧。 详细分享&#xff…

docker介绍与安装

目录 Docker docker概述 容器化优点 虚拟化架构 docker与虚拟机区别 docker三大核心概念 docker运行的原理 Docker安装 查看 docker 版本信息 docker 信息查看 Docker docker概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开…

Perceiver Perceiver IO: 人工智能的多功能工具

如今人工智能系统使用的大多数架构都是专业的。2D 残差网络可能是处理图像的一个很好的选择,但它最多只能用于其他类型的数据,比如自动驾驶汽车中使用的激光雷达信号或机器人中使用的 torques。此外,标准架构在设计时通常只考虑一项任务&…

Seal AppManager发布:基于平台工程理念的全新应用部署管理体验

4月12日,数澈软件Seal(以下简称“Seal”)宣布推出新一代应用统一部署管理平台 Seal AppManager,采用平台工程的理念,降低基础设施操作的复杂度为研发和运维团队提供易用、一致的应用管理和部署体验,进而提升…

SpringMVC使用介绍-快速入门

文章目录SpringMVCSpringMVC快速入门bean加载控制SpringMVC SpringMVC快速入门 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 使用SpringMVC技术开发web程序流程: 1.创建web工程&a…

[牛客复盘] 牛客小白月赛70 20230407

[牛客复盘] 牛客小白月赛70 20230407 一、本周周赛总结A、 小d和答案修改2. 思路分析3. 代码实现B、小d和图片压缩1. 题目描述2. 思路分析3. 代码实现C、小d和超级泡泡堂1. 题目描述2. 思路分析3. 代码实现D、小d和孤独的区间1. 题目描述2. 思路分析3. 代码实现E、小d的博弈1. …

C语言内存函数介绍以及实现

目录 前言 一:内存拷贝函数 (1)memcpy( )函数 (2)memove( )函数 二:内存比较函数 三:内存设置函数 前言 本文介绍的函数的函数声明都在头文件string.h中。 一:内存拷贝函数 (1)memcpy( )函数 函数声明:void* memcpy(void* dest,const void* src,size_t num) 作用…

【python】制作一个简单的界面,有手就行的界面~

目录前言准备工作试手小案例开始我们今天的案例教学尾语 💝前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! ttkbootstrap 是一个基于 tkinter 的界面美化库, 使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序。 ttkbootstrap 不…

8:00面试,8:05就出来了 ,问的实在是太变态了···

从外包出来,没想到算法死在另一家厂子。 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到12月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟…

Yolov5_DeepSort_Pytorch:基于 Yolov5 + Deep Sort 的实时多目标跟踪器

Yolov5_DeepSort_Pytorch:基于 Yolov5 Deep Sort 的实时多目标跟踪器 原创 视界君 Python视界 昨天 Python视界分享 原文地址:Yolov5_DeepSort_Pytorch:基于 Yolov5 Deep Sort 的实时多目标跟踪器 简介 该存储库包含一个两阶段跟踪器。…

linux主机设置主机间免密登录

举例:想要在A主机免密登录到B主机; 此文案前提是linux都安装了ssh服务,可以使用systemctl status sshd 查看ssh状态 1、使用任意用户在A主机上执行ssh-keygen -t rsa 所有提示均按回车默认,会在当前目录生成.ssh文件夹&#xff0…

实战-高并发下的读/写

文章目录高并发下的读/写高并发读业务场景高并发写业务场景同时高并发读和高并发写业务场景高并发读策略一:加缓存/读副本方案一:本地缓存/集中式缓存方案二:数据库层面的改变,Master/Slave,使用主从完成读写分离方案三…

MySQL学习笔记:count(1)、count(*)、count(字段)的区别

关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT()。 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会…

JUC多并发编程 CompletableFuture

Future 接口理论 Future 接口(FutureTask 实现类): 定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等 方法图: 类图: 代码示例: import ja…

Maven聚合开发【实例详解---5555字】

目录 一、Maven聚合开发_继承关系 二、Maven聚合案例 1. 搭建dao模块 2. 搭建service模块 3. 搭建web模块 4. 运行项目 一、Maven聚合开发_继承关系 Maven中的继承是针对于父工程和子工程。父工程定义的依赖和插件子工程可以直接使用。注意父工程类型一定为POM类型工程…

数字电路学习笔记 门电路概述

1 高低电平的实现 在数字电路中,输入输出都是二值逻辑,其高低电平用“0”和“1”表示其高低电平的获得是通过开关电路来实现,如二极管或三极管电路组成。如图 高低电平实现原理电其原理电路 当开关 S 断开时,输出电压 v。 V。&am…

Alibaba开源的Java诊断工具Arthas-实战

目录参考一、启动二、支持的ognl表达式三、监听参数监听Controller 的参数和返回值监听完整参数和返回值监听kafka消费监听单个参数监听异常按照耗时进行过滤监听参数比较四、变量和方法查询静态成员变量值查询配置类具体属性的值通过类加载器查看Spring容器中对象所有属性执行…

Qt显示数学公式

文章目录一、前言二、效果展示三、库文件四、使用教程五、MathML语法5.1、顶层元素5.2、字符/符号元素5.3、通用布局元素5.4、边标和角标元素5.5、表格教学5.6、数学符号六、转换工具6.1、手写转换公式工具myscript6.2、截图转换公式工具Mathpix一、前言 目前项目中需要显示数…

MySQL数据库学习——约束——概述+演示

我们先创建一个表&#xff1a; create database itheima; use itheima; create table user(id int primary key auto_increment comment 主键, name varchar(10) not null unique comment 姓名,age int check ( age > 0 && age <120 ) comment 年龄,status char…

零代码是什么?零代码平台适合谁用?

随着信息技术的发展&#xff0c;软件开发领域也不断发生变革&#xff0c;零代码&#xff08;No-Code&#xff09;开发模式越来越受到关注。 零代码到底是什么&#xff0c;能不能用通俗的话来说&#xff1f;这就来给大家讲一讲&#xff01; 01 零代码为什么出现&#xff1f; 随…