当前位置: 首页 > news >正文

【Python机器学习】回归——缩减系数来“理解”数据

如果数据特征比样本点还多,是不可以使用线性回归的,因为在计算(x^{T}x)^{-1}的时候会出错。

如果特征比样本点还多(n>m),也就是说输入数据的矩阵x不是满秩矩阵。非满秩矩阵在求逆时会出问题。

为了解决上述问题,可以使用岭回归,接着是lasso法,该方法效果很好但是计算复杂。还有前向逐步回归,可以得到与lasso相似的效果,且更容易实现。

岭回归

简单来说,岭回归就是在矩阵x^{T}x上加一个\lambda I从而使得矩阵非奇异,进而能对x^{T}x+\lambda I求逆。其中矩阵I是一个m*m的单位矩阵,对角线上元素全是1,其他元素全为0。而\lambda是一个用户定义的数值。在这种情况下,回归系数的计算公式将变成:

\widehat{w}=(X^{T}X+\lambda I)^{-1}X^{T}y

岭回归最先用来处理特征数多余样本数的情况,现在也用于子啊估计中加入偏差,从而得到更好的估计。这里通过引入\lambda来限制了所有w之和,通过引入该惩罚项,能够减少不必要的参数,这个技术在统计学中也叫做缩减。

缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,和简单的线性回归相比,错减法能取得更好的预测效果。

与之前用到的训练其他参数所用方法类似,通过预测误差最小化得到\lambda:数据获取之后,首先抽一部分数据用于测试,剩余的作为训练集用于训练参数w。训练完毕后再测试集上测试预测性能。通过选取不同的\lambda来重复上述测试过程,最终得到一个使预测误差最小的\lambda

岭回归代码实现:

def ridgeRegres(xMat,yMat,lam=0.2):xTx=xMat.T*xMatdenom=xTx+eye(shape(xMat)[1])*lamif linalg.det(denom)==0.0:print('行列式为0')return ws=denom.I*(xMat.T*yMat)return wsdef ridgeTest(xArr,yArr):xMat=mat(xArr)yMat=mat(yArr).TyMean=mean(yMat,0)yMat=yMat-yMeanxMeans=mean(xMat,0)xVar=var(xMat,0)xMat=(xMat-xMeans)/xVarnumTestPets=30wMat=zeros((numTestPets,shape(xMat)[1]))for i in range(numTestPets):ws=ridgeRegres(xMat,yMat,exp(i-10))wMat[i,:]=ws.Treturn wMat

上述代码包含两个函数:ridgeRegres()用于计算回归系数,而函数ridgeTest()用于在一组\lambda上测试结果。

第一个函数ridgeRegres()实现了给定lambda下的岭回归求解。如果没有指定lambda,则默认为0.2。由于lambda是Python保留的关键字,所以代码中用lam代替。函数首先构建矩阵X^{T}X,然后用lam乘以单位矩阵。在普通回归方法可能会产生错误时,岭回归仍然可以正常工作。这里需要做一个检查。最后,如果矩阵非奇异就计算回归系数并返回。

为了使用岭回归和缩减技术,首先需要对特征做标准化处理,使每维特征具有相同的重要性。ridgeRegres()展示了数据标准化过程。具体的做法就是所有特征都减去各自的均值并除以方差。

处理完成后就可以在30个不同lambda下调用ridgeRegres()函数。这里的lambda应该以指数级变化,这样可以看出lambda在取非常小的值时和取非常大的值时分别对结果造成的影响。最后将所有的回归系数输出到一个矩阵并返回。

尝试在鲍鱼数据集上运行:

abX,abY=loadDataSet('abalone.txt')
ridgeWeights=ridgeTest(abX,abY)
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(ridgeWeights)
plt.show()

上图绘制出了回归系数与log(\lambda )的关系。在最左边,即\lambda最小时,可以得到所有系数的原始值(与线性回归一致),而在右边,系数全都缩减为0;在中间部分的某值将可以取得最好的预测效果。为了定量的找到最佳参数值,还需要进行交叉验证。另外还要判断哪些变量对结果预测最具有影响力。

lasso

不难证明,在增加下面的约束时,普通的最小二乘法回归会得到与岭回归一样的公式:

\sum_{k=1}^{n}w_{k}^{2}\leqslant \lambda

上面的表达式限定了所有回归系数的平方和不能大于\lambda。使用最小二乘法回归在当两个或更多的特征相关时,可能会得出一个很大的正系数和一个很大的负系数。正式因为上述限制条件的存在,使得岭回归可以避免这个问题。

与岭回归类似,另一个缩减方法lasso也对回归系数做了限定,限定条件如下:

\sum_{k=1}^{n}\left |w_{k} \right |\leqslant \lambda

唯一不同的点在于:这个约束条件用绝对值代替了平方和。虽然约束形式只是稍作变化,结果却完全不同:在\lambda足够小的时候,一些系数会因此被迫缩减到0,这个特性可以帮助我们更好地理解数据。这两个约束条件在看起来相差无几,但是极大地增加了计算复杂度。

前向逐步回归

前向逐步回归算法可以得到与lasso差不多的效果,但更简单。它属于一种贪心算法,即每一步都尽可能减少误差。一开始,所有的权重都设置为1,然后每一步所做的决策是对某个权重增加或者减少到一个很小的值。

该算法的伪代码如下:

数据标准化,使其分布满足0均值和单位方差

在每轮迭代过程中:

    设置当前最小误差lowestError为正无穷

    对每个特征:

        增大或缩小:

            改变一个系数得到一个新的w

            计算新w下的误差

            如果误差Error小于当前最小误差lowestError:设置Wbest等于当前的W

        将w设置为新的Wbest

实际代码实现:

def stageWise(xArr,yArr,eps=0.01,numIt=100):#转换数据并存入矩阵xMat=mat(xArr)yMat=mat(yArr).TyMean=mean(yMat,0)yMat=yMat-yMean#xMat=regularize(xMat)m,n=shape(xMat)returnMat=zeros((numIt,n))#创建向量ws来保存w的值ws=zeros((n,1))wsTest=ws.copy()wsMax=ws.copy()#循环numIt次,并且在每次迭代时都打印出w向量,用于分析算法执行的过程和效果for i in range(numIt):print(ws.T)lowestError=inffor j in range(n):for sign in [-1,1]:wsTest=ws.copy()wsTest[j]=wsTest[j]+eps*signyTest=xMat*wsTestrssE=rssError(yMat.A,yTest.A)if rssE<lowestError:lowestError=rssEwsMax=wsTestws=wsMax.copy()returnMat[i,:]=ws.Treturn returnMat

上述stageWise()是一个逐步线性回归算法的实现,它与lasso做法相近但计算简单。该函数的输入包括:输入数据xArr和预测变量yArr。此外还有两个参数:一个是eps,表示每次迭代需要调整的步长;另一个是numIt,表示迭代次数。

函数首先将输入数据转换并存入矩阵中,然后把特征按照均值为0方差为1进行标准化处理。在这之后创建了一个向量ws来保存w的值,并且为了实现贪心算法建立了ws的两份副本。接下来的优化过程需要迭代numIt次,并且在每次迭代时都打印出w向量,用于分析算法执行的过程和效果。

贪心算法在所有特征上运行两次for循环,分别计算增加或减少该特征对误差的影响。这里使用的是平方误差,通过之前的函数rssError()得到。该误差初始值设为正无穷,经过与所有的误差比较后取最小的误差,整个过程循环迭代进行。

xArr,yArr=loadDataSet('abalone.txt')
print(stageWise(xArr,yArr,0.01,200))

上述结果中,w1和w6都是0,表示他们不对目标值造成任何影响,也就是说这些特征很可能是不需要的。另外,在参数eps设置为0.01时,一段时间后系数就已经饱和并在特定值之间来回震荡,这是因为步长太大的缘故。


xMat=mat(xArr)
yMat=mat(yArr).T
yM=mean(yMat,0)
yMat=yMat-yM
weights=standRegres(xMat,yMat.T)
print(weights.T)

逐步线性回归算法的主要优点在于它可以帮助人们理解现有的模型并做出改进,当构建了一个模型后,可以运算该算法找出重要的特征,这样就有可能及时停止对那些不重要特征的收集。最后,如果用于测试,该算法每100次迭代后就可以构建出一个模型,可以使用类似于10折交叉验证的方法比较这些模型,最终选择使误差最小的模型。

当应用缩减方法(比如逐步线性回归或岭回归)时,模型也就增加了偏差,与此同时却减小了模型的方差。

相关文章:

【Python机器学习】回归——缩减系数来“理解”数据

如果数据特征比样本点还多&#xff0c;是不可以使用线性回归的&#xff0c;因为在计算的时候会出错。 如果特征比样本点还多&#xff08;n>m&#xff09;&#xff0c;也就是说输入数据的矩阵x不是满秩矩阵。非满秩矩阵在求逆时会出问题。 为了解决上述问题&#xff0c;可以…...

组件设计原则

state数据结构设计 用数据描述所有内容数据要结构化&#xff0c;易于程序操作&#xff08;遍历、查找&#xff09;数据要可扩展&#xff0c;以便增加新的功能 组件设计组件通讯 从功能上拆分层次尽量让组件原子化容器组件&#xff08;只管理数据&#xff09;& UI组件&am…...

简单搭建vue项目

1.先安装node.js和vite&#xff0c;具体参考&#xff1a; 2.管理员身份运行cmd&#xff0c;跳转到node安装目录&#xff1a; 输入&#xff1a; npm create vitelatest 输入项目名称&#xff0c;选择vue和JavaScript 2.VisualStudioCode打开(可能需要管理员权限)创建的文件夹,点…...

ctfhub Bypass disable_function

LD_PRELOAD url 蚁剑连接 选择插件 点击开始 查看到此文件名编辑连接拼接到url后面重新连接 点击开启终端 在终端执行命令 ls / /readfile ShellShock url CTFHub 环境实例 | 提示信息 蚁剑连接 写入shell.php <?phpeval($_REQUEST[ant]);putenv("PHP_test() { :…...

【Qt】探索Qt网络编程:构建高效通信应用

文章目录 前言&#xff1a;1. Qt 网络编程介绍1.1 什么是网络编程&#xff1f;1.2 Qt的模块 2. UDP Socket2.1 核心 API 概述2.2 写一个带有界面的 Udp 回显服务器2.3 写一个带有界面的 Udp 客户端 3. TCP Socket3.1 核心 API 概述3.2 代码&#xff1a; 4. HTTP Client4.1 核心…...

【Android Studio】原生应用部署第三方插件(探针)

一、本地引入包流程 &#xff08;一&#xff09;本地引入包内容 &#xff08;二&#xff09;本地引入包操作步骤 将 【probe-android-sdk】目录里面所有的aar包复制到嵌码项目工程&#xff08;App级别&#xff09;的 libs 目录下 二、添加插件 &#xff08;一&#xff09;…...

嵌入式学习之路 15(C语言基础学习——指针操作一维字符型数组)

字符型数组的定义和初始化 char s[] "hello";&#xff1a;在栈上开辟空间并初始化。const char *p "hello";&#xff1a;指针 p 指向字符串常量区的 "hello"&#xff0c;只能读取不能修改。 指针变量的类型确定 指针变量的类型由其所指向的数据…...

C++ STL专题 list的底层实现

目录 1.模拟实现list 2.节点模板讲解 3.迭代器模板讲解 3.1为什么template 有三个类型参数 (1).class T (2).class ref (3).class ptr 3.2 *重载 3.3 ->重载 3.4 前置和后置的重载 3.5 前置--和--后置的重载 3.6 和!的重载 4. list模板讲解 4.1 begin()函数 …...

【JavaEE】线程池

目录 前言 什么是线程池 线程池的优点 ThreadPollExecutor中的构造方法 corePoolSize && maximumPoolSize keepAliveTime && unit workQueue threadFactory 如何在java中使用线程池 1.创建线程池对象 2.调用submit添加任务 3.调用shutdown关闭线程池…...

lvs实战项目-dr模式实现

一、环境准备 主机名IP地址router eth0&#xff1a;172.25.254.100 eth1&#xff1a;192.168.0.100 clienteth0&#xff1a;172.25.254.200lvseth1&#xff1a;192.168.0.50web1web2 1、client配置 [rootclient ~]# cat /etc/NetworkManager/system-connections/eth0.nmconne…...

JSONP跨域

1 概述 定义 json存在的意义&#xff1a; 不同类型的语言&#xff0c;都能识别json JSONP(JSON with Padding)是JSON的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;一般来说位于 server1.example.com 的网页无法与不是 s…...

Linux--shell脚本语言—/—终章

一、shell函数 1、shell函数定义格式 参数说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。 2、参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&#xff0c;将以最后一条命令运行结果&#xff…...

免费代理池是什么,如何使用代理IP进行网络爬虫?

互联网是一个庞大的数据集合体&#xff0c;网络信息资源丰富且繁杂&#xff0c;想要从中找到自己需要的信息要花费较多的时间。为了解决这个问题&#xff0c;网络爬虫技术应运而生&#xff0c;它的主要作用就是在海量的互联网信息中进行爬取&#xff0c;抓取有效信息并存储。然…...

CAN直接网络管理(20240805)

长安CAN网络管理规范 个人理解&#xff1a;管理CAN网络中各NM节点的工作模式&#xff08;状态&#xff09;&#xff1b; 1.术语定义 &#x1f449;节点地址&#xff1a;用于唯一标识网络中每个节点的单字节数字&#xff0c;取值范围是 0x00~0xFF。&#x1f449;状态迁移&#x…...

HTML5+CSS3笔记(Xmind格式):第二天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; 新增选择器&#xff1a; 1.选择相邻兄弟 2.属性选择器 3.结构性伪类选择器 4.整体结构类型 5.标签结构类型 6.指定子元素的序号 7.文本选择伪元素 8.表单中使用的状态伪类选择器 9.内容…...

视频压缩文件太大了怎么缩小?6个视频压缩技巧,速度收藏起来!

高清视频文件&#xff0c;尤其是那些以 1080p 和 720p 清晰度为特征的视频&#xff0c;通常都拥有相当大的体积&#xff0c;会占据大量计算机存储空间。因此&#xff0c;为了更好地将它们进行分享和存储&#xff0c;您可能需要对它们进行压缩&#xff0c;以减小它们的尺寸。然而…...

Python接口自动化测试数据提取分析:Jmespath

1、引言 在处理JSON数据时&#xff0c;我们常常需要提取、筛选或者变换数据。手动编写这些操作的代码不仅繁琐&#xff0c;而且容易出错。Python作为一个功能强大的编程语言&#xff0c;拥有丰富的库和工具来处理这些数据。今天&#xff0c;将介绍一个实用的Python库——JMESP…...

特种设备作业叉车司机题库及答案

1.在我们平时工作中&#xff0c;经常接触的汽油、柴油、机油、油棉纱、木材等均为() A、助燃物质 B、可燃物质 C、着火源 参考答案:B 2.叉车满载行驶时&#xff0c;如合成重心靠后() A、有利于纵向稳定 B、有利于横向稳定 C、纵向和横向均有利 参考答案:A 3.蓄电池车行驶中放…...

Linux 操作系统速通

一、安装虚拟机 1. VmWare 安装下载 vmware workstation pro 16 下载 win R 输入 ncpa.cpl 确保网卡正常 2. CentOS 系统下载 CentOS 系统下载 将 CentOS 系统安装到虚拟机 3. 查看虚拟机 IP 命令 ifconfig 4. finalShell 安装下载 finalShell 下载 输入用户名一般是 ro…...

IIS漏洞大全(附修复方法)

IIS6.0 IlS Server 在 Web 服务扩展中开启了 WebDAV&#xff0c;配置了可以写入的权限&#xff0c;造成任意文件上传。 漏洞复现 fofa:"llS-6.0" or 本地搭建2003 server 1)开启 WebDAV 和写权限: 做好准备工作后开启环境&#xff0c;然后我们去访问配置的IP&#…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比

2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...

React与原生事件:核心差异与性能对比解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…...

ai流式文字返回前端和php的处理办法

PHP后端 php端主要是用到ob_flush和flush&#xff0c;头改为流式。 基本代码 代码如下&#xff1a; <?php header(Content-Type:text/event-stream); header(Cache-Control:no-cache); header(Connection:keep-alive);function streamPostRequest($url,$data){$chcurl_…...