SPGL1最小二乘法求解器

SPGL1:最小二乘法求解器

一、简介
SPGL1旨在解决以下三个问题:
1、Lasso 问题:
2、基追踪去噪(BPDN)问题:
3、基追踪(BP)问题:
特点:
1、线性算子A
SPGL1依赖于矩阵或向量运算A*x和A’*y,且接受评估这些内积的显示矩阵(密集或稀疏)和函数。
2、稀疏正则器
如果使用者所用的函数可评估基本范数、对偶范数和可投影到基本范数上,用户可使用任意范数P范数(||·||P)。默认为1范数。SPGL1还可提供L(1,2)范数的求解以及特殊的多矢量测量向量的情况。
3、实数和复数域
SPGL1适用于实数域和复数域中的问题。在复数域中,使用的是对应的正确的1范数的和

二、安装和下载
1、解压,将创建一个名为 spgl1/. 的目录。我们将此目录称为 spgroot。
2、启动matlab并在matlab命令行中运行以下程序。
addpath spgroot
cd spgroot
spgsetup
要验证SPGL1安装是否正常,运行
spgdemo
下载地址:https://github.com/mpf/spgl1.
https://friedlander.io/spgl1/install/

三、用户手册

1、Lasso
标准Lasso问题为以下形式:
在这里插入图片描述
该问题可用SPGL1中的 ‘spg_lasso’ 函数进行求解
[x,r,g,info] =spg_lasso(A,b,tau,options)
其中 options 参数控制求解器的停止准则和求解过程,其由关键词和对应的值组成,详见 ‘求解选项’ 。如果未要求具体的options,则使用默认值。

eg:
s = RandStream(‘mt19937ar’,‘Seed’,0);
A = randn(s,5,10);
b = randn(s,5,1);
[x,r,g,info] = spg_lasso(A,b,0.5);

其中x表示重构出的解,残差r=b-Ax,目标在解中的梯度g = -A’r,info包含退出时的状态,迭代的次数和总运行的时间等这样的信息,在 ‘信息结构’ 中查看详情。

eg:若我们在Lasso问题中使用τ=1,所需的迭代次数超过默认,即10倍于A中的行数。我们则能通过以下命令增加最大循环次数:
[x,r,g,info] = spg_lasso(A,b,1,‘iterations’,100);
在这种情况下大约需要循环90次才能找到最优解。

2、基追踪去噪
标准的基追踪去噪问题如下:
在这里插入图片描述
解该问题可调用spg_bpdn函数:
[x,r,g,info] = spg_bpdn(A,b,sigma,options)
特被的,当σ=0时,上述问题变为基追踪问题:
在这里插入图片描述
上述情况可用基追踪求解:
[x,r,g,info]=spg_bp(A,b,options)
基追踪问题也可通过求解一系列具有合适的τ的Lasso问题。因此,梯度输出g为最新的τ所对应的Lasso子问题的目标值。

3、群范数
SPGL1支持三种主要问题(Lasso、基追踪去噪和基追踪)的群稀疏问题。将范数定义为每个集合中子向量的欧几里得范数的总和。为了解决群范数基追踪降噪问题,可使用以下命令:
[x,r,g,info] = spg_group(A,b,groups,sigma,options)

groups 参数是一个向量,其中包含每个元素的组号x。组号本身可任意选择,只要同一组中的元素具有相同的编号即可。群组不必包含连续的元素,尽管实际上他们通常是连续的。

eg:我们使用3组,编号为1,2和3:
s = RandStream(‘mt19937ar’,‘Seed’,0);
A = randn(s,5,10);
b = randn(s,5,1);
sigma = 1.2
x = spg_group(A,b,[1,1,1,2,2,2,2,3,3,3],sigma);

在这种情况下,我们得到的解具有组稀疏(块稀疏):一些块的值为0,其余非0.
x = 0 0 0-0.1804 -0.2038 -0.1107 0.0037 0 0 0

4、多测量矢量
一类特殊的群稀疏问题是多测量矢量问题。在该问题中,我们得到一个测量矩阵B,并假设位置矩阵X的所有列具有相同的支撑集。该问题通常是通过最小化X中行的欧几里得范数和来实现的。这可以通过适当的向量化B和X以及适当的重新定义A来解决。
SPGL1中提供了对应的功能:
[X,R,G,info] = spg_mmv(A,B,sigma,options)
eg:
s = RandStream(‘mt19937ar’,‘Seed’,0);
A = randn(s,5,7);
B = randn(s,5,6);
[X,R,G,info] = spg_mmv(A,B,3.5);

5、通用接口
SPGL1的通用接口
[x,r,g,info] = spgl1(A,b,tau,sigma,x0,options)
[x,r,g,info] = spgl1(A,b,tau,sigma,options)
[x,r,g,info] = spgl1(A,b,tau,options)
1、options参数是可选择的,其为参数名和其对应的值组成的结构。详见‘options’
2、参数x0为x的初始值。如果设置x0,则必须提供参数τ和σ
3、用初始值x解Lasso问题时,设σ为空向量[ ];解基追踪去噪问题时,设置τ为0,或空向量[ ],(强烈建议)或提供一个初始值τ(不建议)。当初始值τ非常确定时,该值应小于解中的τ,这点很重要;因为τ从太大的值减小可能会非常耗时或导致次优的基追踪解。当参数x0设为空向量[]时,将会使用默认的初始值x。

6、自定义范数
SPGL1可以扩展为使用自定义范数来解决Lasso问题和基追踪降噪问题。为此,我们需要提供三个功能
1、options.primal_norm,其可评估给定向量x的任意P范数。
2、options.dual_norm,其能评估原范数所对应的对偶范数。
3、options.project,其能评估正交投影到与原范数相对应的单位范数球上,即集合Bp:={x| ||x||p≤τ},当τ为正数时。
关于自定义范数的例子可以在spg_group求解器中找到

四、options
下面讨论可用选项options.name。这些值可直接在options结构中设置,也可以作为变量值与name一起使用。
在以下例子中,最大循环次数为1000,且限制所有输出的有效位数。
% Direct specification of parameters
[x,r,g,info] = spgl1(A,b,tau,‘iterations’,1000,‘verbosity’,0);
options也能通过单独的结构使用,可使用spgSetParams使用默认选项,也可直接设置;
% Separate preparation of the options
options = spgSetParams(‘iterations’,1000,‘verbosity’,0);
[x,r,g,info] = spgl1(A,b,tau,options);

% Manual creation of the options structure
options = struct();
options.iterations = 1000;
options.verbosity = 0;
[x,r,g,info] = spgl1(A,b,tau,options);

eg:单个参数的option结构
% Function call with mixed structure and key-value pair parameters
[x,r,g,info] = spgl1(A,b,tau,options,‘mu’,0);

参数集:
SPGL1支持两种预定义的参数集,名为“classic”(默认)和“hybrid”。在其他options中,classic模式设置为option.rootfindMode=1(初始根查找)和options.hybridMode=false(无空间搜索)。hybrid模式设置为options.rootfindMode=1(对偶根查找)和options.hybridMode=true。大致上,“classic”比“hybrid”模式更快,但更不准确。详情见 理论 部分。
eg:
% Use “classic” mode and set mu=0
[x,r,g,info] = spgl1(A,b,tau,‘classic’,‘mu’,0);

% Use “hybrid” mode
[x,r,g,info] = spg_bpdn(A,b,‘hybrid’);
每种模式的具体options见:
https://github.com/mpf/spgl1/blob/569e20f66aa6a4895dcac72de9cb34fce65e53e2/spgSetParms.m#L20

五、正则化
Lasso和基追踪去噪的正则化版本通过声明一个带有加权的单位矩阵A和零向量b来得到。为了方便,SPGL1支持直接正则化,则Lasso的标准式修改为:
在这里插入图片描述
基追踪问题修改为:
在这里插入图片描述
参数μ可由 options.mu 或参数 mu 进行幅值。

六、理论
Pareto曲线
Pareto曲线在SPGL1中扮演一个非常重要的角色。其能给出最小残差的范数,因为关于τ的函数限制了在迭代过程中x的最大范数,即||x||p≤τ。

求根
SPGL1通过解决一系列具有不同τ值的Lasso问题来求解基追踪问题。给定Lasso问题的解就能确定该点的Pareto曲线的斜率,这使我们能够进行根的求解。假设我们从τ=0得到了Lasso问题的解(这种情况x恒等于0),然后我们计算得到梯度,如下图所示,做切线与所要求的σ相交,即图中红色的点。然后用该点的τ解Lasso,重复上述过程,直至解的残差范数足够接近σ。
在这里插入图片描述
实现方式:
SPGL1提供控制根查找过程的选项。options.rootfindMode 指定根查找是使用原始模式还是双重模式完成的,参数值分别为0和1。

原始模式
当使用原始模式时,SPGL1使用较为松弛的条件来判断Lasso问题是否已解决,并用初始目标来近似梯度。这种寻根模式可能非常快,但可能会导致τ超过最小值。芥末是在需要快速解决问题或对于无法高精度解决子问题的大规模问题时很有用。下图为在原始模式下的Pareto曲线上寻根时较为夸张的示例图。由上图可知,实际τ应取1.2,此时τ取为1.8。
在这里插入图片描述
双模式:
在双重寻根模式下,我们基于Pareto曲线的线性欠近似来寻根。前提是τ低于最终值(强烈建议设为0)。如下所示,我们使用对偶目标值(灰色点)和梯度来确定下一个目标值τ。新值σ在每次迭代中为下一个根的查找步骤保留最大值。
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值