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进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我…

linux 看防火墙的启停日志,LINUX下防火墙iptables的日志管理

iptables的日志(log)由syslogd纪录和管理。初始存放在 /var/log/messages里面。自动采取循环纪录(rotation)的方式记录。但是由于混在 messages中&#xff0c;对于管理和监视产生了不便。这里&#xff0c;我简单介绍一下我的 iptables日志的管理&#xff0c;循环&#xff0c;和…

怎么判断一个字符串的最长回文子串是否在头尾_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…

linux内核没有iobuf,LINUX2.6.26.6内核下双口RAM的驱动函数测试成功!

驱动程序&#xff1a;#include //#include #include #include #include #include #include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include #include #include MODULE_LICENSE("…

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

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

linux 内核 丢弃分片包,LINUX内核关于IP分片重组问题请教

最近研究学习IP分片重组&#xff0c;也拜读了不少dx的阅读理解。可还是有疑问&#xff0c;请教xdm。源代码&#xff1a;linux-2.4.26\linux-2.4.26\net\ipv4\ip_fragment.cIP分片的重组大概经过以下几个函数:0/ ip_defrag1/ ip_find-->ip_frag_create-->ip_frag_intern2/…

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# 对…

linux 库函数 劫持,Linux hook技术之-Ring3下动态链接库.so函数劫持

劫持普通函数当然没有什么意思了&#xff01;我们要劫持的是系统函数&#xff01;我们知道&#xff0c;Unix操作系统中对于GCC而言&#xff0c;默认情况下&#xff0c;所编译的程序中对标准C函数(fopen、printf、execv家族等等函数)的链接&#xff0c;都是通过动态链接方式来链…

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安装requests库命令,在Linux--Ubuntu18.04环境下安装requests库

之前在服务器上装过requests库&#xff0c;但是记忆中花了好大的力气才成功&#xff0c;现在因为一次意外&#xff0c;服务器重装系统&#xff0c;现在这些乱七八糟的库又要重装一遍&#xff0c;与上次不同的是&#xff0c;这次我装一遍就成功了。现在分享一下成功的经历。Pyth…

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

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

redhat enterprise linux 哪个版本好,Red Hat Enterprise Linux 版本显示中(Santiago)是啥意思?...

楼主的逻辑还有问题。1、linux跟windows都是一种操作系统&#xff0c;但是它用的分区格式是ext3的&#xff0c;ntfs和fat都不合适。安装过程中你可以自己选择删除现有分区创建新分区&#xff0c;但如果你不了解&#xff0c;很可能把所有的分区都清了。2、redhat分区多大合适看你…

.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;希望你能认真学习吸收。比如笔者今天写的这一篇一今天这…

linux在bin下加入ssh,移植 ssh 到开发板

2》编译/home/arm下新建目录sshwork&#xff0c;并且将源码复制到该目录下mkdir /home/arm/sshworkcp zlib-1.2.3.tar.gz openssl-0.9.8d.tar.gz openssh-4.6p1.tar.gz/home/arm/sshwork/home/arm/sshwork下新建目录lib&#xff0c;用来保存生成的库文件。mkdir /home/arm/sshw…

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

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

linux shell 第几行,Linux shell 获得字符串所在行数及位置

shell 获得字符串所在行数及位置01 获取字符串所在的行数方式一&#xff1a;用grep -n[rootroot]# cat testapplebitcreatedelectexeflowgood[rootroot]# cat test | grep -n exe5:exe[rootroot]# cat test | grep -n exe | awk -F ":" {print $1}5方式二&#xff1a…

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…