实例:罚函数法解基追踪问题
考虑基追踪问题:
其为一个线性等式约束的非光滑优化问题,使用二次罚函数作用于等式约束则得到 LASSO 问题:
其中 为罚因子。
令 ,罚因子逐渐增加到无穷,则等价于 LASSO 问题中的 逐渐减小,对应于 LASSO 问题求解的连续化策略。当 趋于 时 LASSO 问题的解收敛到 BP 问题的解。这里我们设定一个固定的 (其越小逼近基追踪问题的质量越高)为目标,从一个较大的 逐渐减小到该值。
目录
生成 LASSO 问题
clear;
设定随机种子。
seed = 97006855; ss = RandStream('mt19937ar','Seed',seed); RandStream.setGlobalStream(ss);
构造 LASSO 优化问题
生成随机的矩阵 和向量 以使得 。
m = 512; n = 1024; A = randn(m, n); u = sprandn(n, 1, 0.1); b = A * u; x0 = zeros(n, 1);
罚函数法
罚函数法在这里对应于 LASSO 问题的连续化策略,我们从 开始以 的比例衰减到 ,以逐渐近似求解原始的基追踪问题。对于每个 对应的 LASSO 子问题,使用固定步长的次梯度法进行求解。
opts = struct(); opts.maxit = 600; opts.alpha0 = 0.0002;
固定步长的次梯度法求解子问题。 f_val 记录求解过程中 的值, g_val 记录约束违反度 的值。
opts.step_type = 'fixed'; x = x0; f_val = []; g_val = []; for mu = [10, 1, 1e-1, 1e-2, 1e-3] addpath('../lasso_subgrad'); [x, out] = l1_subgrad(x, A, b, mu, opts); f_val = [f_val, out.f_hist_best(1:out.itr) / mu]; g_val = [g_val, out.g_hist(1:out.itr) / norm(b)]; end
次梯度法解 LASSO 问题
不适用连续化策略,直接对 时的 LASSO 问题利用次梯度法进行求解。将结果与罚函数法(LASSO 的连续化策略) 的求解效果进行对比。
opts.maxit = numel(f_val); opts.ftol = 0; [x1, out] = l1_subgrad(x0, A, b, 1e-3, opts); f_val1 = out.f_hist_best / 1e-3; g_val1 = out.g_hist / norm(b);
结果可视化
fig1 = figure; x = 1:numel(f_val); semilogy(x, f_val, 'k-', x, f_val1, 'k--'); legend('罚函数法', '次梯度法'); ylabel('$\hat{f}^k/\mu$', 'fontsize', 14, 'interpreter', 'latex'); xlabel('迭代步'); print(fig1, '-depsc','penalty1.eps'); fig2= figure; semilogy(x, g_val, 'k-', x, g_val1, 'k--'); legend('罚函数法', '次梯度法'); ylabel('$\|Ax^k - b\|/\|b\|$', 'fontsize', 14, 'interpreter', 'latex'); xlabel('迭代步'); print(fig2, '-depsc','penalty2.eps');
结果分析
从函数值和约束的违反度两个角度,罚函数法的效果均好于直接使用次梯度法。 在迭代初期,由于 较大,这意味着约束 可以不满足, 从而算法可将优化的重点放到 上;随着迭代进行, 单调减小, 此时算法将更注重于可行性( 的大小)。直接取 效果不佳, 这是因为惩罚项 的权重太大,次梯度法会尽量使得迭代点满足 ,而忽视了 项的作用。
参考页面
关于固定正则化系数 的 LASSO 问题次梯度法,请参考 LASSO 问题的次梯度解法。
另外,LASSO 的连续化策略,请参考 LASSO 的连续化策略。
此页面的源代码请见: demo_cont.m。
版权声明
此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。
著作权所有 (C) 2020 文再文、刘浩洋、户将