lasso回归_一文读懂线性回归、岭回归和Lasso回归

8f85c252141d70ece1271fee2d122fd1.png

(图片由AI科技大本营付费下载自视觉中国)

作者 | 文杰

编辑 | yuquanle

本文介绍线性回归模型,从梯度下降和最小二乘的角度来求解线性回归问题,以概率的方式解释了线性回归为什么采用平方损失,然后介绍了线性回归中常用的两种范数来解决过拟合和矩阵不可逆的情况,分别对应岭回归和Lasso回归,最后考虑到线性回归的局限性,介绍了一种局部加权线性回归,增加其非线性表示能力线性回归A、线性回归假设有数据有:1cb5e0fe6d59d7c0d923fdd655a629a3.png其中ec6043b913f309f24248a41fce6d626c.png,db22a39028e6222f3a9a60404951597f.png。其中m为训练集样本数,n为样本维度,y是样本的真实值。线性回归采用一个高维的线性函数来尽可能的拟合所有的数据点,最简单的想法就是最小化函数值与真实值误差的平方(概率解释-高斯分布加最大似然估计)。即有如下目标函数:8f495529906d53a53a8c6b760a8ef9c2.png其中线性函数如下:0745642ce6ac53924225f065b3e73c08.png构建好线性回归模型的目标函数之后,接下来就是求解目标函数的最优解,即一个优化问题。常用的梯度优化方法都可以拿来用,这里以梯度下降法来求解目标函数。55e9b1ee9d694a42f59738759f815a33.png另外,线性回归也可以从最小二乘法的角度来看,下面先将样本表示向量化,41a4dc63a5f46a65b99514497ea99c8b.png6b649ccd34503231525287ba7721e980.png,构成如下数据矩阵。b70ecf1ba497d886bcee998a1152b1f7.png那么目标函数向量化形式如下:29067d1a70e630c194ef65ce41ce0157.png可以看出目标函数是一个凸二次规划问题,其最优解在导数为0处取到。95404d4012b72e3c808e306a09f1ccd7.png值得注意的上式中存在计算矩阵的逆,一般来讲当样本数大于数据维度时,矩阵可逆,可以采用最小二乘法求得目标函数的闭式解。当数据维度大于样本数时,矩阵线性相关,不可逆。此时最小化目标函数解不唯一,且非常多,出于这样一种情况,我们可以考虑奥卡姆剃刀准则来简化模型复杂度,使其不必要的特征对应的w为0。所以引入正则项使得模型中w非0个数最少。当然,岭回归,lasso回归的最根本的目的不是解决不可逆问题,而是防止过拟合。B、概率解释损失函数与最小二乘法采用最小化平方和的概率解释。假设模型预测值与真实值的误差为ab6b718a25eed0654fcccd409749069b.png,那么预测值80110f78730868a1d8e059b50d188c22.png与真实值b96167e3fec7936b0a30dc51f7156833.png之间有如下关系:111beb3ac2074dce40aff78fb05a2253.png根据中心极限定理,当一个事件与很多独立随机变量有关,该事件服从正态分布 。一般来说,连续值我们都倾向于假设服从正态分布。假设每个样本的误差ab6b718a25eed0654fcccd409749069b.png独立同分布均值为0,方差为σ的高斯分布2d726cce04624ae137256a57b7b42080.png,所以有:40887a7be53be8a295ad4e603ddf6ea1.png即表示b96167e3fec7936b0a30dc51f7156833.png满足以均值为80110f78730868a1d8e059b50d188c22.png,方差为ab6b718a25eed0654fcccd409749069b.png的高斯分布。d8165125809098ec918ea9639e5f9612.png由最大似然估计有:a81cec0cca791bf06b11f0f9ca776fc1.png岭回归和Lasso回归岭回归的目标函数在一般的线性回归的基础上加入了正则项,在保证最佳拟合误差的同时,使得参数尽可能的“简单”,使得模型的泛化能力强(即不过分相信从训练数据中学到的知识)。正则项一般采用一,二范数,使得模型更具有泛化性,同时可以解决线性回归中不可逆情况。5a6fc55dbee5479b0753c4b01c92233e.png其迭代优化函数如下:8b453dbd84fa2994a89c278553224ad4.png另外从最小二乘的角度来看,通过引入二范正则项,使其主对角线元素来强制矩阵可逆。2611956e796b5bb703b79be544c52a8b.pngLasso回归采用一范数来约束,使参数非零个数最少。而Lasso和岭回归的区别很好理解,在优化过程中,最优解为函数等值线与约束空间的交集,正则项可以看作是约束空间。可以看出二范的约束空间是一个球形,而一范的约束空间是一个方形,这也就是二范会得到很多参数接近0的值,而一范则尽可能非零参数最少。fd17e6c7dbfd53be1c85042c44c537f8.png值得注意的是线性模型的表示能力有限,但是并不一定表示线性模型只能处理线性分布的数据。这里有两种常用的线性模型非线性化。对于上面的线性函数的构造,我们可以看出模型在以ae2d6c9caf12e763789fe0ef060d219c.png的坐标上是线性的,但是并不表示线性的模型就一定只能用于线性分布问题上。假如我们只有一个特征309c9de7e6f762c2242964f7b60aa9b3.png,而实际上回归值是86d43b69615c4baac50bc1f72f60bacb.png等,我们同样可以采用线性模型,因为我们完全可以把输入空间映射到高维空间4267688c78374d88882990b8d2c063cd.png,其实这也是核方法以及PCA空间变换的一种思想,凡是对输入空间进行线性,非线性的变换,都是把输入空间映射到特征空间的思想,所以只需要把非线性问题转化为线性问题即可。另外一种是局部线性思想,即对每一个样本构建一个加权的线性模型。局部加权线性回归考虑到线性回归的表示能力有限,可能出现欠拟合现象。局部加权线性回归为每一个待预测的点构建一个加权的线性模型。其加权的方式是根据预测点与数据集中点的距离来为数据集中的点赋权重,当某点距离预测点较远时,其权重较小,反之较大。由于这种权重的机制引入使得局部加权线性回归产生了一种局部分段拟合的效果。由于该方法对于每一个预测点构建一个加权线性模型,都要重新计算与数据集中所有点的距离来确定权重值,进而确定针对该预测点的线性模型,计算成本高,同时为了实现无参估计来计算权重,需要存储整个数据集。局部加权线性回归,在线性回归基础上引入权重,其目标函数(下面的目标函数是针对一个预测样本的)如下:4f724b06fa3158a3acabab92ed331b3f.png一般选择下面的权重函数,权重函数选择并非因为其类似于高斯函数,而是根据数据分布的特性,但权重函数的选取并不一定依赖于数据特性。008c9f1c4f2385dc2ee48ebfba0871ae.png其中是待预测的一个数据点。对于上面的目标函数,我们的目标同样是求解使得损失函数最小化,同样局部加权线性回归可以采用梯度的方法,也可以从最小二乘法的角度给出闭式解。29640f227fef6e1012e2898befc92459.png其中7de67d98200302a6e6326de2b71a5a17.png是对角矩阵,f992a829d4b994d80278476f41aee0f5.png。线性回归核心思想最小化平方误差,可以从最小化损失函数和最小二乘角度来看,优化过程可以采用梯度方法和闭式解。在闭式解问题中需要注意矩阵可逆问题。考虑到过拟合和欠拟合问题,有岭回归和lasso回归来防止过拟合,局部加权线性回归通过加权实现非线性表示。代码实战A、线性回归

/**
线性回归函数的实现,考虑一般的线性回归,最小平方和作为损失函数,则目标函数是一个无约束的凸二次规划问题,
由凸二次规划问题的极小值在导数为0处取到,且极小值为全局最小值,且有闭式解。根据数学表达式实现矩阵之间的运算求得参数w。
**/int regression(Matrix x,Matrix y){
    Matrix xT=x.transposeMatrix();
    Matrix xTx=xTx.multsMatrix(xT,x);
    Matrix xTx_1=xTx.niMatrix();
    Matrix xTx_1xT=xTx_1xT.multsMatrix(xTx_1,xT);
    Matrix ws;
    ws=ws.multsMatrix(xTx_1xT,y);cout<<"ws"<<endl;
    ws.print();return 0;
}

B、岭回归和Lasso回归

/**
下面的岭回归函数只是在一般的线性回归函数的基础上在对角线上引入了岭的概念,不仅有解决矩阵不可逆的线性,同样也有正则项的目的,
采用常用的二范数就得到了直接引入lam的形式。
**/int ridgeRegres(Matrix x,Matrix y,double lam){
    Matrix xT=x.transposeMatrix();
    Matrix xTx=xTx.multsMatrix(xT,x);Matrix denom(xTx.row,xTx.col,lam,"diag");
    xTx=xTx.addMatrix(xTx,denom);
    Matrix xTx_1=xTx.niMatrix();
    Matrix xTx_1xT=xTx_1xT.multsMatrix(xTx_1,xT);
    Matrix ws=ws.multsMatrix(xTx_1xT,y);cout<<"ws"<<endl;
    ws.print();return 0;
}

C、局部加权线性回归

/**
局部加权线性回归是在线性回归的基础上对每一个测试样本(训练的时候就是每一个训练样本)在其已有的样本进行一个加权拟合,
权重的确定可以通过一个核来计算,常用的有高斯核(离测试样本越近,权重越大,反之越小),这样对每一个测试样本就得到了不一样的
权重向量,所以最后得出的拟合曲线不再是线性的了,这样就增加的模型的复杂度来更好的拟合非线性数据。
**///需要注意的是局部加权线性回归是对每一个样本进行权重计算,所以对于每一个样本都有一个权重w,所以下面的函数只是局部线性回归的一个主要辅助函数Matrix locWeightLineReg(Matrix test,Matrix x,Matrix y,const double &k){Matrix w(x.row,x.row,0,"T");double temp=0;int i,j;/**
    根据测试样本点与整个样本的距离已经选择的核确定局部加权矩阵,采用对角线上为局部加权值
    **/for(i=0;i    {
        temp=0;for(j=0;j        {
            temp+=(test.data[0][j]-x.data[i][j])*(test.data[0][j]-x.data[i][j]);
        }
        w.data[i][i]=exp(temp/-2.0*k*k);
    }
    Matrix xT=x.transposeMatrix();
    Matrix wx=wx.multsMatrix(w,x);
    Matrix xTwx;
    xTwx=xTwx.multsMatrix(xT,wx);
    Matrix xTwx_1;
    xTwx_1=xTwx.niMatrix();
    Matrix xTwx_1xT;
    xTwx_1xT=xTwx_1xT.multsMatrix(xTwx_1,xT);
    Matrix xTwx_1xTw;
    xTwx_1xTw=xTwx_1xTw.multsMatrix(xTwx_1xT,w);
    Matrix ws = xTwx_1xTw * y;return ws;
}

详细代码:https://github.com/myazi/myLearn/blob/master/LineReg.cpp(*本文为 AI科技大本营转载文章,转载请联系原作者)

精彩推荐

2019 中国大数据技术大会(BDTC)历经十一载,再度火热来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。【早鸟票】【特惠学生票】限时抢购,扫码了解详情!b48b9a2c66b347159ec38cabcf7bb6a8.png

推荐阅读

  • 100多次竞赛后,他研发了一个几乎可以解决所有机器学习问题的框架

  • 王霸之路:从0.1到2.0,一文看尽TensorFlow“奋斗史”

  • 伯克利人工智能研究院开源深度学习数据压缩方法Bit-Swap,性能创新高

  • NLP被英语统治?打破成见,英语不应是「自然语言」同义词

  • TensorFlow2.0正式版发布,极简安装TF2.0(CPU&GPU)教程

  • 肖仰华:知识图谱构建的三要素、三原则和九大策略 | AI ProCon 2019

  • AI落地遭“卡脖子”困境:为什么说联邦学习是解决良方?

  • 10分钟搭建你的第一个图像识别模型 | 附完整代码

  • 限时早鸟票 | 2019 中国大数据技术大会(BDTC)超豪华盛宴抢先看!

e3541fefa893440619c9b2dd6bea47f6.png

你点的每个“在看”,我都认真当成了喜欢

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

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

相关文章

springcloud架构特点_打造企业级微服务平台架构,分布式应用场景管理

微服务平台架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务。微服务系统可以在“自己的程序”中运行&#xff0c;并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我…

怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 5 迅速判断回文串的Manacher算法...

本文始发于个人公众号&#xff1a; TechFlow题意Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Link: https://leetcode.com/problems/longest-palindromic-substring/翻译给定一个字符串s&#xff0c…

spring和mybatis结合做简单的增删查改系统_springbootamp;amp;vue简单的景点信息管理系统...

springboot&&vue简单的景点信息管理系统这两天闲着没有什么事&#xff0c;就根据陈哥的教程&#xff0c;试着写了一个springboot和vue的简单的景点信息管理系统。也就大致实现了最基本的增删查改。先看看效果图吧&#xff1a;1、登陆界面&#xff1a; 2、注册界面&…

spark算子_十、Spark之详解Action类算子

常用Action类算子列表reduce(func): 通过func函数来对RDD中所有元素进行聚合运算&#xff0c;先运算分区内数据&#xff0c;再运算分区间数据。scala> val rdd1 sc.makeRDD(1 to 100)rdd1: org.apache.spark.rdd.RDD[Int] ParallelCollectionRDD[4] at makeRDD at :24# 对…

await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能

本周&#xff0c;Nodejs v14.3.0 发布。这个版本包括添加顶级 Await、REPL 增强等功能。REPL 增强通过自动补全改进对 REPL 的预览支持&#xff0c;例如&#xff0c;下图中当输入 process.ver 之后&#xff0c;不需要输入剩下的实际内容&#xff0c;它帮我们生成了自动补全的输…

linux输入ls后不显示_零基础学习之Linux基础命令小结

安装完重启后&#xff0c;没有像sery所说在图形界面崩溃了&#xff0c;由于我没有安装X-WINDOWS而是直接进入了文本界面。如果你想做linux管理的话&#xff0c;最好在文本界面下工作&#xff0c;这样会适应如下图:第一行显示的是我们所安装的linux是Red Hat 企业4第二行显示的是…

.gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名

前言.idea该不该提交到代码仓库中呢&#xff1f;你的意见呢&#xff1f;今日早读文章由《Flask Web开发》作者李辉分享。正文从这开始&#xff5e;&#xff5e;在网络上&#xff0c;我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志…

监控linux时间不对,shell 计算故障时间 配合web监控

#!/bin/bash#checkfail.log 为SHELL监控网站时间存放的日志文件 https://blog.51cto.com/junhai/2437965fail_time(){starttimetail -n 1000 checkfail.log |grep "$url"|grep "第1次"|tail -n 3|head -n 1|awk {print $1, $2} #取网站挂掉的时间endtimet…

linux redis清空数据恢复,Redis数据恢复--误删数据后一次吓尿的经历

1、起因&#xff0c;一个flushdb命令因为误操作&#xff0c;输入了一个flushdb命令&#xff0c;导到redis里0号库里的数据全部清空&#xff0c;OMG&#xff0c;这里有不少重要信息&#xff0c;如果被领导知道&#xff0c;必开除2、appendonly留有生机仔细想想&#xff0c;当时数…

c语言 枚举类型 uint32_浅谈C语言枚举类型 | 附自创用法分享

经济学家说过&#xff0c;路边是不会有100元的&#xff1b;但如果有&#xff0c;你还是要捡起来。同理&#xff0c;在貌似万物免费的网络时代&#xff0c;你是很难找到有针对性的好资料&#xff1b;但是如果有&#xff0c;希望你能认真学习吸收。比如笔者今天写的这一篇一今天这…

java pdf增删改查_如何利用Java代码操作索引库?

今天是刘小爱自学Java的第161天。感谢你的观看&#xff0c;谢谢你。学习计划安排如下&#xff1a;学了几天的Elasticserch&#xff0c;但都是它本身的知识点&#xff0c;如何通过Java语言去操作它呢&#xff1f;这就好比以前学数据库&#xff0c;在数据库工具中通过sql语句也能…

sublime text3 怎么配置、运行python_SublimeText3按ctrl+b执行python无反应

最后更新时间&#xff1a;2017-09-14 现象&#xff1a; 在Sublime中打开.py文件&#xff0c;按”ctrlb”执行时无反应。点击工具->编译系统中已经有且识别到Python&#xff0c;但执行”run&#xff08;ctrlshiftb&#xff09;”时无反应&#xff0c;Sublime左下角提示”No B…

internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...

GitHub链接&#xff1a;calmisential/YOLOv3_TensorFlow2​github.com我主要参考了yolov3的一个keras实现版本&#xff1a;qqwweee/keras-yolo3​github.com目前支持在PASCAL VOC 2012数据集上训练和自定义数据集上训练&#xff0c;具体的训练过程可参考项目仓库中的README文档…

深井软岩巷道群支护技术与应用_深井软岩巷道深浅孔帷幕注浆技术

一、成果内容1.基本原理对失修巷道进行刷扩、支护&#xff0c;满足使用断面后进行帮顶喷浆、底板整平&#xff0c;先底板注浆&#xff0c;然后帮、顶注浆。锚架充支护巷道直接底板整平后&#xff0c;先底板后帮、顶注浆。通过全断面深浅孔联合注水泥浆进行巷道加固&#xff0c;…

店铺咨询系统c语言,课内资源

1 题目介绍1.1 问题描述出于不同目的的旅客对交通工具和交通路径有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个交通咨询系统程序,为旅客提供最优决策的交通咨询。1.2 需求分析提供对…

f分布表完整图_【教育统计答疑】如何理解正态分布、均值分布、^2分布、t分布和F分布...

许多教育统计的初学者都表示这几个分布感到学起来非常吃力&#xff0c;结合最近上课的体会以及答疑的情况&#xff0c;觉得很有必要在这里简单地对这部分内容进行澄清和梳理&#xff0c;以助理解。首先&#xff0c;“为什么要学习这几个分布”可能是许多人纠结的问题&#xff0…

新颖的c语言题目,新颖版c语言经典习题100例(全面面)

新颖版c语言经典习题100例(全面面) (66页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;19.90 积分&#xfeff;实用文档C语言习题100例(最新整理版)习题目录&#xff1a;(按住Ctrl点击可以快速跳转到…

c语言jt808协议库,平台如何应答——关于JT/T808协议

前两篇也说明了一些应答的相关内容&#xff0c;对于刚接触的开发者来说恐怕还是不太容易理解&#xff0c;这里专门列举一个篇幅来讲解如何针对终端设备上报的信息进行应答。严格来讲&#xff0c;如果不应答&#xff0c;终端设备会判别为服务平台断开连接&#xff0c;就会重复发…

熊猫的python小课账号_学习python中的pandas有没有好的教程推荐?

之前好多人私信我python数据分析怎么快速入门&#xff0c;我在这里直接介绍一下自己的心得经验吧。 要学习pandas&#xff0c;我并不建议看大量的教程&#xff0c;等看完教程&#xff0c;天都黑了&#xff0c;一觉醒来热情都凉了。 我的建议是&#xff0c;首先放平心态&#xf…

ubuntu nfs linux,Ubuntu的NFS功能配置

环境:Ubuntu 10.04步骤:1.sudo apt-get install portmap2.sudo apt-get install nfs-kernel-server注意:第2步我安装失败,换源后仍然如此,最后我在新立得里面搜索到nfs-kernel-server,安装成功3.在更目录下新建共享目录:mkdir /forlinux4.gedit /etc/exprots,在后面添加/forlin…