实例:近似点梯度法、 Nesterov 加速算法求解 LASSO 问题

  • 实例:近似点梯度法、 Nesterov 加速算法求解 LASSO 问题
    • 考虑 LASSO 问题
    • 构建 LASSO 优化问题
    • 求解 LASSO 优化问题
    • 结果可视化
    • 结果分析

实例:近似点梯度法、 Nesterov 加速算法求解 LASSO 问题

考虑 LASSO 问题

min ⁡ x 1 2 ∥ A x − b ∥ 2 2 + μ ∥ x ∥ 1 , \displaystyle \min_x \frac{1}{2}\|Ax-b\|_2^2+\mu\|x\|_1, xmin​21​∥Ax−b∥22​+μ∥x∥1​,

在连续化策略下,分别利用近似点梯度法和两种 Nesterov 加速算法对其求解。

构建 LASSO 优化问题

设定随机种子。

clear;
seed = 97006855;
ss = RandStream('mt19937ar','Seed',seed);
RandStream.setGlobalStream(ss);

构造 LASSO 优化问题

min ⁡ x 1 2 ∥ A x − b ∥ 2 2 + μ ∥ x ∥ 1 , \min_x \frac{1}{2}\|Ax-b\|_2^2+\mu\|x\|_1, xmin​21​∥Ax−b∥22​+μ∥x∥1​,

生成随机的矩阵 A A A 和向量 u u u 以使得 b = A u b=Au b=Au。给定正则化系数为 1e-3。

m = 512;
n = 1024;
A = randn(m, n);
u = sprandn(n, 1, 0.1);
b = A * u;
x0 = randn(n, 1);
mu = 1e-3;
求解 LASSO 优化问题

BB 步长带线搜索的连续化近似点梯度法

首先以更严格的停机准则,得到最优值 f ∗ f^* f∗ 的参考。

opts.opts1.ls = 1;

opts.opts1.bb = 1;

AA = A' * A;
L = eigs(AA, 1); % d = eigs(A,k) 返回 k 个模最大的特征值。
opts = struct();
opts.method = 'proximal_grad';
opts.verbose = 0; % 不等于0时输出每步迭代信息,否则不输出
opts.maxit = 4000;
opts.opts1 = struct();
opts.opts1.ls = 1; % 使用线搜索算法
opts.opts1.bb = 1; % 使用BB算法
opts.alpha0 = 1/L; % 初始步长
opts.ftol = 1e-12;
opts.gtol = 1e-10;
addpath('../LASSO_con') % 添加所有子目录的路径到工作路径
[x, out] = LASSO_con(x0, A, b, mu, opts);
f_star = min(out.fvec); % 最优值

BB 步长带线搜索的连续化近似点梯度法

opts = struct();
opts.method = 'proximal_grad';
opts.opts1 = struct();
opts.verbose = 0;
opts.maxit = 400;
opts.opts1.ls = 1;
opts.opts1.bb = 1;
opts.alpha0 = 1/L;
[x, out] = LASSO_con(x0, A, b, mu, opts);
data1 = (out.fvec - f_star)/f_star; % 收敛速度
k1 = min(length(data1),400);
data1 = data1(1:k1);

固定步长无线搜索的连续化近似点梯度法

opts = struct();
opts.method = 'proximal_grad';
opts.opts1 = struct();
opts.verbose = 0;
opts.maxit = 400;
opts.opts1.ls = 0; % 不使用线搜索算法
opts.opts1.bb = 0; % 不使用BB算法
opts.alpha0 = 1/L;
[x, out] = LASSO_con(x0, A, b, mu, opts);
data2 = (out.fvec - f_star)/f_star;
k2 = min(length(data2),400);
data2 = data2(1:k2);

BB 步长线搜索的 FISTA 算法

opts = struct();
opts.method = 'Nesterov';
opts.opts1 = struct();
opts.verbose = 0;
opts.maxit = 400;
opts.opts1.ls = 1;
opts.opts1.bb = 1;
opts.alpha0 = 1/L;
opts.ftol0 = 1;
[x, out] = LASSO_con(x0, A, b, mu, opts);
data3 = (out.fvec - f_star)/f_star;
k3 = min(length(data3),400);
data3 = data3(1:k3);

固定步长无线搜索的 FISTA 算法

opts = struct();
opts.method = 'Nesterov';
opts.opts1 = struct();
opts.verbose = 0;
opts.maxit = 400;
opts.opts1.ls = 0;
opts.opts1.bb = 0;
opts.alpha0 = 1/L;
opts.ftol0 = 1;
[x, out] = LASSO_con(x0, A, b, mu, opts);
data4 = (out.fvec - f_star)/f_star;
k4 = min(length(data4),400);
data4 = data4(1:k4);

固定步长无线搜索的第二类 Nesterov 加速算法

opts = struct();
opts.method = 'Nesterov2nd';
opts.opts1 = struct();
opts.verbose = 0;
opts.maxit = 400;
opts.opts1.ls = 0;
opts.opts1.bb = 0;
opts.alpha0 = 1/L;
opts.ftol0 = 1;
[x, out] = LASSO_con(x0, A, b, mu, opts);
data5 = (out.fvec - f_star)/f_star;
k5 = min(length(data5),400);
data5 = data5(1:k5);
结果可视化

在第一张图中,我们展示连续化近似点梯度法在 BB 步长和固定步长下的收敛性的差别。

fig = figure;
semilogy(0:k1-1, data1, '-', 'Color',[0.2 0.1 0.99], 'LineWidth',2);
hold on
semilogy(0:k2-1, data2, '-.','Color',[0.99 0.1 0.2], 'LineWidth',1.5);
legend('BB步长', '固定步长');
ylabel('$(f(x^k) - f^*)/f^*$', 'fontsize', 14, 'interpreter', 'latex');
xlabel('迭代步');
print(fig, '-depsc','proxg.eps');

在第二张图中,我们对比基础的近似点梯度法和其各版本的加速算法的收敛性差别。

fig = figure;
semilogy(0:k1-1, data1, '-', 'Color',[0.99 0.1 0.99], 'LineWidth',2);
hold on
semilogy(0:k3-1, data3, '-.','Color',[0.99 0.1 0.2], 'LineWidth',1.2);
hold on
semilogy(0:k4-1, data4, '--','Color',[0.2 0.1 0.99], 'LineWidth',1.5);
hold on
semilogy(0:k5-1, data5, ':','Color',[0.5 0.2 1], 'LineWidth',1.8);
legend('BB步长的近似点梯度法', 'BB步长的FISTA算法','固定步长的FISTA算法', '固定步长的第二类Nesterov算法');
ylabel('$(f(x^k) - f^*)/f^*$', 'fontsize', 14, 'interpreter', 'latex');
xlabel('迭代步');
print(fig, '-depsc','fproxg.eps');
结果分析

左图展示了固定步长和 BB 步长的连续化近似点梯度法的收敛速度,结合了线搜索的 BB步长可以显著提高算法的收敛速度。

在右图中,我们将近似点梯度法和几种加速算法进行比较。在固定步长下,FISTA算法相较于第二类 Nesterov 算法稍快,也注意到这里的 FISTA 算法是非单调算法。BB 步长有效地加快收敛,此外,带有线索搜地近似点梯度法可以比同样设定的 FISTA 算法更快收敛。

实例:近似点梯度法、 Nesterov 加速算法求解 LASSO 问题相关推荐

  1. Nesterov加速算法

    Nesterov加速算法 上一届分析了近似点梯度法的收敛速度:如果光华部分的梯度是利普西茨连续的,则目标函数的收敛速度可以达到O1kO{\frac{1}{k}}Ok1​,一个自然的问题是如果仅用梯度信 ...

  2. Nesterov 加速算法

    Nesterov 加速算法 梯度下降 动量梯度下降 Nesterov 梯度下降 思考 梯度下降是我们在优化或者深度学习中经常要用到的算法,基于最原始的梯度下降算法,有很多加速算法被提出,今天我们着重介 ...

  3. MATLAB粒子群算法求解带充电站(桩)的电动车辆路径规划EVRP问题代码实例

    MATLAB粒子群算法求解带充电站(桩)的电动车辆路径规划EVRP问题代码实例 问题实例描述: 现有一个配送中心需要向20个客户点进行送货.每个客户点有不同货物需求量和卸货服务时间.配送中心和客户点的 ...

  4. MATLAB帝国(主义)竞争算法求解超市物流配送选址问题实例

    帝国竞争算法编程问题实例: MATLAB帝国竞争算法求解超市物流配送选址问题代码实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要求在 ...

  5. MATLAB灰狼优化算法求解超市物流配送中心选址问题代码实例

    MATLAB灰狼算法求解超市物流配送选址问题实例 作者:麦哥 MATLAB灰狼优化算法求解超市物流配送中心选址问题代码实例 灰狼算法编程问题实例: 在范围为(0,0)到(100,100)的矩形区域内, ...

  6. MATLAB差分进化算法求解超市物流配送选址问题实例

    差分进化算法编程问题实例: MATLAB差分进化算法求解超市物流配送中心选址问题代码实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要 ...

  7. MATLAB粒子群算法求解超市物流配送选址问题实例

    粒子群算法编程问题实例: MATLAB粒子群算法求解超市物流配送选址问题实例 粒子群算法编程问题实例: 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需 ...

  8. MATLAB模拟退火算法求解超市物流配送选址问题实例

    模拟退火算法编程问题实例: MATLAB模拟退火算法求解超市物流配送选址问题实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要求在该矩 ...

  9. MATLAB人工蜂群算法求解超市物流配送选址问题代码实例

    MATLAB人工蜂群算法求解超市物流配送选址问题代码实例 MATLAB人工蜂群算法求解超市物流配送选址问题代码实例 人工蜂群算法编程问题实例: 在范围为(0,0)到(100,100)的矩形区域内,散布 ...

最新文章

  1. SSL证书可以给多个域名使用吗?
  2. 吴教主深度学习和神经网络课程总纲
  3. PL/SQL Developer如何修改表数据
  4. 存clob为空的值_oracle clob 存储空间
  5. php开启mysqlnd,如何启用mysqlnd的PHP?
  6. 制作程序化装饰花纹图案_装饰图案
  7. php 登录安全认证,介绍几种常用的web安全认证方式
  8. 神经架构搜索(Neural Architecture Search,NAS)介绍
  9. 浅谈App对我们行业门户网站的作用
  10. python图形绘制含注释
  11. gitlab 使用现有 nginx 服务器
  12. git push --set-upstream
  13. vscode解决方案 关闭源代码管理
  14. macOS中安装secoclient
  15. Servlet是什么
  16. 2020软件测试最新视频教程大合集汇总
  17. 浅谈Innodb存储结构(Buffer Pool、Double Write Buffer、Change Buffer、Redo log、Undo Log、自适应索引.......)
  18. linux下利用图形化工具合并分区
  19. 微信云开发之小游戏排行榜的实现,云数据库,云函数【白玉无冰】每天进步一点点
  20. 联想T430 WIN8系统换WIN7系统的相关设置

热门文章

  1. Edge浏览器自带小游戏----你知道吗!?
  2. Flink with Avro Confluent Kafka-Registry
  3. wampserver3.1.7_x64启动后橙色不变绿解决办法
  4. 一道题错多遍?错题有可能就是你考场丢分的题!
  5. ruoyi后台管理系统docker部署,基于ruoyi-3.7.0
  6. 看我们如何“把大象放进冰箱里”
  7. A20:Unity 数学知识——数学公式汇总
  8. 思维导图 XMind 8 Update 8 Pro for Mac 中文破解版
  9. win10 链接oracle11g,win10系统PLSQLDeveloper无法连接Oracle11g的解决方法
  10. python输入年份打印全年日历_python使用calendar输出指定年份全年日历的方法