我的第一篇博客哟(沧海一声笑)
基础知识传送门:https://zhuanlan.zhihu.com/p/46999826
参考博文传送门:http://blog.sina.com.cn/s/blog_4a03c0100101b3c3.html。
我的工作:对代码进行了一些些修改,修正了错误部分,以及去掉了无用的部分。
本来Matlab就不是很熟,算法更是一头雾水(嘤~)花掉了姐妹儿两天的时间,肩周炎都犯了(大哭)
注释都写上啦,接下来更新匹配追踪(OMP)。
废话不多说,上代码==》
------------更新说明------------
该算法似乎不太准确,直接使用matlab的lasso会更好。有时间更新。

%主文件
clc;
clear;
y=[7.6030 -4.1781 3.1123 1.0586 7.8053]';
A=[0.5377 -1.3077 -1.3499 -0.2050 0.6715 1.0347 0.8884;1.8339 -0.4336 3.3049 -0.1241 -1.2075 0.7269 -1.1471;-2.2588 0.3426 0.7254 1.4897 0.7172 -0.3034 -1.0689;0.8622 3.5784 -0.0631 1.4090 1.6302 0.2939 0.8095;0.3188 2.7694 0.7147 1.4172 0.4889 -0.7873 -2.9443];
beta1 = lars1(A, y, 'lasso', 0, 1, [], 1); |
%lars1函数
function beta = lars1(X, y, ~, ~, ~, ~, ~)[n,p] = size(X);%传感矩阵的[行数,列数]nvars = p; %y最多由p个向量决定maxk = 8*nvars; % 最多迭代次数beta = zeros(2*nvars, p);%beta为每次迭代得稀疏系数的预测mu = zeros(n, 1); % LARS向lsq解决方案移动时的当前“位置”,n*1的0向量(列)I = 1:p; % 非积极集,开始为所有向量下标(观测矩阵X的总列数),存储下标1、2、3、4、5、6、7A = []; % 积极集,存储下标(已选定向量)R = []; lassocond = 0; % 出现负相关变量时,lassocond=1k = 0; % 当前迭代次数vars = 0; % 目前积极变量的个数。fprintf('Step\tAdded\tDropped\t\tActive set size\n');%命令窗口显示字,matlab2019版%并非所有变量都为积极集时,k未达到最大迭代次数进行以下循环while vars < nvars  && k < maxk k = k + 1; c = X'*(y - mu);% 各自变量与因变量的相关度。fprintf("相关度:");%列向量disp(c');[C,j] = max(abs(c(I)));%最相关向量,仅产生于非积极集,C为最大相关度,j为下标。此处并未去除负值%注意!j为(最相关变量在X中的列数)在I中的下标if ~lassocond R = cholinsert(R,X(:,I(j)),X(:,A));A = [A I(j)]; %把最相关向量所对应下标(元素I(j))加入到积极集I(j) = []; %把进入积极集的向量下标从非积极集中踢出来。注意!元素直接左移,不留空位vars = vars + 1;  %目前的积极集中的变量个数+1b=size(A);%显示:迭代次数,积极集加入变量,总积极向量个数fprintf('%d\t\t%d\t\t\t\t\t%d\n', k, A(b(2)), vars);end%计算角平分线s = sign(c(A)); % 返回与 c(A)大小相同的数组 s;c(A)>0,s元素是1;c(A)=0,s元素是0;c(A)<0,s元素是-1; GA1 = R\(R'\s);fprintf("\nGA1:");%列向量disp(GA1');AA = 1/sqrt(sum(GA1.*s));fprintf("AA:");disp(AA);w = AA*GA1;fprintf("w:");%列向量disp(w');%列向量u = X(:,A)*w; % 角平分线(单位矢量),n*1的列向量fprintf('角平分线 u = ');%列向量disp(u');%计算移动系数gama(伽马),计算在这个方向上走多远,步长if vars == nvars % 如果所有的变量都是积极集,则变成一个最小二乘问题。gamma = C/AA;  % C/A:相关度/AAelsea = X'*u; % 各变量与角平分线的相关性temp = [(C - c(I))./(AA - a(I)); (C + c(I))./(AA + a(I))];%步长。必须选其中的正数。拼起来的列向量gamma = min([temp(temp > 0); C/AA]); %[temp中大于0的数字组成列向量,数字]end%找出其中的负相关变量lassocond = 0;temp = -beta(k,A)./w';[gamma_tilde] = min([temp(temp > 0) gamma]);%gamma_tilde:伽马+波浪线% fprintf('gamma_tilde = %d',gamma_tilde));%判断A中是否有负相关变量j = find(temp == gamma_tilde);%j(此处j指A中变量下标)有时有(积极集删除操作,转61行),有时没有if gamma_tilde < gamma %存在负相关变量gamma = gamma_tilde;%gama取最小lassocond = 1;   %lasso条件满足endfprintf('gamma = %d\n',gamma);mu = mu + gamma*u;  % mu:逼近Y 的向量fprintf('逼近Y 的向量 mu = ');%列向量disp(mu');beta(k+1,A) = beta(k,A) + gamma*w';%本次=上次beta中相关位置元素相应增加 gamma*w';beta(k,A)为beta的k行A列,A为列表fprintf('beta = ');%列向量disp(beta(k,:));% 删除负相关变量if lassocond == 1R = choldelete(R,j);%删除与拟合为反方向的列I = [I A(j)];%将该元素加入非积极集vars = vars - 1;%积极集减少一个元素A(j) = [];b=size(I);%展示:迭代次数,积极集删除的向量,积极变量个数fprintf('%d\t\t\t\t%d\t\t\t%d\n', k, I(b(2)), vars);end%计算残差error_pri=y-X*(beta(k,:))';             error=sum(error_pri.^2);fprintf('误差:');disp(error)if error < 1e-6break;  endend  %while结束
function R = cholinsert(R, x, X)diag_k = x'*x; % diagonal(对角线) element k in X'X matrixif isempty(R)R = sqrt(diag_k);elsecol_k = x'*X; % elements of column k in X'X matrixR_k = R'\col_k'; % R'R_k = (X'X)_k, solve for R_kR_kk = sqrt(diag_k - R_k'*R_k); % norm(x'x) = norm(R'*R), 排除查找最后一个元素R = [R R_k; [zeros(1,size(R,2)) R_kk]]; % update Rendfunction R = choldelete(R,j)R(:,j) = []; % remove column jn = size(R,2);for k = j:np = k:k+1;[G,R(p,k)] = planerot(R(p,k)); %删除该列额外元素,吉文斯平面旋转if k < nR(p,k+1:n) = G*R(p,k+1:n); % adjust rest of rowendendR(end,:) = []; % remove zero'ed out row

Matlab实现Lasso-Lars相关推荐

  1. lasso,lars算法详细推导过程-数学

    首发于程序员的伪文艺 关注专栏写文章 从Lasso开始说起 李新春 既可提刀立码,行遍天下:又可调参炼丹,卧于隆中. ​关注他 317 人赞同了该文章 Lasso是Least Absolute Shr ...

  2. 【回归分析】MATLAB实现Lasso回归算法

    Lasso回归算法 Lasso(Least Absolute Shrinkage and Selection Operator) 回归是一种线性回归方法,它可以在保持预测准确性的同时,通过稀疏性约束( ...

  3. R语言惩罚logistic逻辑回归(LASSO,岭回归)高维变量选择分类心肌梗塞数据模型案例...

    全文下载链接:http://tecdat.cn/?p=21444 在本文中,逻辑logistic回归是研究中常用的方法,可以进行影响因素筛选.概率预测.分类等,例如医学研究中高通里测序技术得到的数据给 ...

  4. 【sklearn】线性回归、最小二乘法、岭回归、Lasso回归

    文章目录 机器学习的sklearn库 一.回归分析 <1.1>线性回归 1.1.1.Python实现线性回归 <1.2>最小二乘法 1.2.1.MATLAB实现最小二乘法 1. ...

  5. R—基于diabetes数据的逐步回归、岭回归、lasso回归

    #本次diabete数据来源于R中lars包 #语言为R 观察diabetes数据 序号 x.age x.sex - x.glu y x2.age x2.sex - x2.ltg:glu 1 0.03 ...

  6. R语言学习笔记 06 岭回归、lasso回归

    R语言学习笔记 文章目录 R语言学习笔记 比较lm.ridge和glmnet函数 画岭迹图 图6-4 <统计学习导论 基于R语言的应用>P182 图6-6<统计学习导论 基于R语言的 ...

  7. Lasso regression(稀疏学习,R)

    这一讲呢,给大家讲解一下lasso回归.目前这个方法还没有一个正规的中文名,如果从lasso这个单词讲的话,叫套索.那么套索是啥呢,就是套马脖子的东西,见下图: 就是拿这个东西把动物脖子套住,不要它随 ...

  8. 对数据科学家来说最重要的算法和统计模型

    摘要:本文提供了工业中常用的关键算法和统计技术的概要,以及与这些技术相关的短缺资源. 作为一个在这个行业已经好几年的数据科学家,在LinkedIn和Quora上,我经常接触一些学生或者想转行的人,帮助 ...

  9. python软件设计数据分析统计服_Python 和 R 数据分析/挖掘工具互查

    写在前面 在此总结一些在数据分析/挖掘中可能用到的功能,方便大家索引或者从一种语言迁移到另一种.当然,这篇博客还会随时更新(不会另起一篇,为了方便大家索引),请大家如果有需要收藏到书签中. 如果大家还 ...

最新文章

  1. (八)流程控制 for标签和if标签
  2. 拉格朗日插值法的MATLAB源程序
  3. boost::mpl模块实现pop_front相关的测试程序
  4. x86 vs x64
  5. linux内核分析作业3:跟踪分析Linux内核的启动过程
  6. Outlook 阅读窗格(Reading Pane)
  7. 结合 Mist 在本地测试网络上实现代币智能合约
  8. openstack havana vlan安装成功
  9. Java Servlet
  10. Mac安装oh-my-zsh更改终端背景
  11. python中执行shell命令_python中执行shell命令的几个方法小结-阿里云开发者社区
  12. linux yum提示Loaded plugins: fastestmirror, security错误的解决方法
  13. 通俗易懂的机器学习入门
  14. ASP.NET URL Routing
  15. Java调用第三方平台发送手机短信
  16. 用ReadyBoost加速Windows 7
  17. 史上最详细Lip-reading with Hierarchical Pyramidal Convolution and Self-Attention文章记录
  18. 机房收费系统问题集(2)——移动登陆界面+show出子窗体
  19. 中级经济师人力资源专业
  20. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)

热门文章

  1. Java以毫秒为单位返回秒表记录的流逝时间(即求一个程序段的运行时间)
  2. elasticsearch从入门到入门系列(三)---搜索大汇总
  3. [转]网易新闻客户端为什么开始在北京市区的地铁、公交站牌大批量投放广告?...
  4. 重磅 ! CVPR2020最新计算机视觉论文代码分类打包下载
  5. python绘制黑白棋盘_生成黑白棋盘标定图和单目相机标定(python+opencv实现)
  6. SR(Segment Routing)不是MPLS的优化和升级
  7. 【遇见Doris】Apache Doris在一点资讯自媒体平台的应用
  8. python国际象棋ai程序_只需五步!手把手教你搭建国际象棋AI机器人
  9. 【论文翻译】High-Performance Long-Term Tracking with Meta-Updater
  10. ChatGPT国内在线版、微信版