利用 L-BFGS 算法求解基追踪问题_matlab

本文探讨了使用L-BFGS算法求解基追踪问题的方法,针对不同的正则化系数,展示了算法的收敛过程及解的质量。实验结果显示,随着正则化系数增大,解的精确性提高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑基追踪问题:

min ⁡ x ∥ x ∥ 1 , s . t .   A x = b . \displaystyle \min_x \|x\|_1, \mathrm{s.t.}\ Ax = b. xminx1,s.t. Ax=b.

通过计算可知该问题的对偶问题的无约束优化形式不是可微的(因为原问题目标函数不是强凸的,读者可以自行推导验证)。这里,考虑它的正则化问题:

min ⁡ x ∥ x ∥ 1 + 1 2 α ∥ x ∥ 2 2 , s . t .   A x = b . \displaystyle \min_x \|x\|_1 + \frac{1}{2\alpha} \|x\|_2^2, \mathrm{s.t.}\ Ax = b. xminx1+2α1x22,s.t. Ax=b.

通过计算,其对偶问题为:

min ⁡ y − b ⊤ y + α 2 ∥ A ⊤ y − P [ − 1 , 1 ] n ( A ⊤ y ) ∥ 2 2 , \displaystyle \min_y -b^\top y + \frac{\alpha}{2}\|A^\top y - \mathcal{P}_{[-1,1]^n}(A^\top y) \|_2^2, yminby+2αAyP[1,1]n(Ay)22,

目标函数在点 x x x 处的梯度为:

− b + α A ( A ⊤ y − P [ − 1 , 1 ] n ( A ⊤ y ) ) . -b + \alpha A(A^\top y - \mathcal{P}_{[-1,1]^n}(A^\top y)). b+αA(AyP[1,1]n(Ay)).

这里,利用 L-BFGS 算法求解对应的问题。

构建基追踪问题

设定随机种子。

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

生成随机的矩阵 A A A 和向量 u u u 以使得 b = A u b=Au b=Au

R = sprandn(m,n,density) 创建一个随机的 m×n 稀疏矩阵,在区间 [0,1] 中 density 有大约 densitymn 个正态分布的非零项。

m = 512;
n = 1024;
A = randn(m, n);
u = sprandn(n, 1, 0.1); % 稀疏矩阵
b = A * u;

y 0 y^0 y0 为迭代的初始点。

x0 = randn(n, 1);
y0 = A*x0 - b;
L-BFGS 求解x

α \alpha α 为正则化参数,当 α \alpha α 足够大时,正则化问题的解就是原问题的解(可以参考教材相关章节)。

opts.m 为 L-BFGS 算法的记忆对存储数目。 bpdual 为正则化问题的对偶问题的目标函数(参见辅助函数)。

正则化系数 α \alpha α 5 5 5

将正则化系数 α \alpha α 5 5 5,进行实验。迭代了154次,得到近似解

alpha = 5;
opts = struct();
opts.xtol = 1e-8;
opts.gtol = 1e-6;
opts.ftol = 1e-16;

opts.m  = 5;
opts.storeitr = 1; % 迭代每一步是否记录 x 

fun = @(y) bpdual(y,A,b,alpha); % 正则化问题的对偶函数
dist1 = []; % 计算某一步迭代对应的 $x$ 与真实解 $x^*=u$ 的距离。
[y1, ~, ~, Out1]= fminLBFGS_Loop(y0, fun, opts);

如果算得对偶问题的解 y y y,利用如下格式构造出对应的解 x x x

x = α ( A ⊤ y − P [ − 1 , 1 ] n ( A ⊤ y ) ) . x=\alpha(A^\top y - \mathcal{P}_{[-1,1]^n}(A^\top y)). x=α(AyP[1,1]n(Ay)).

out1.xitr 为一个 n × k n\times k n×k 的矩阵,其中 n n n 为对偶问题自变量 y y y 的维度, k k k 为迭代步数,该矩阵记录了L-BFGS 算法的迭代过程 { y t } t = 1 k \{y^t\}_{t=1}^k {yt}t=1k,从 y y y 中恢复出每一步对应的 x x x

AtY = A'*Out1.xitr;
C = max(min(AtY, 1),-1); % 计算 $P_[-1,1] $ 的值
D = AtY - C;
X = alpha*D; % 1024*154

求解的可行度 ∥ A x − b ∥ 2 \|Ax-b\|_2 Axb2 作为判断标准。 dist1 计算某一步迭代对应的 x x x 与真实解 x ∗ = u x^*=u x=u 的距离。

x1 = X(:,end); % X的最后一行为x的最终解
feasi1 = norm(A*x1 - b);
for i = 1:size(X,2) % size(X,2):返回矩阵X的列数,k=154
    dist1 = [dist1;norm(X(:,i) - u,2)];
end
k1 = length(dist1);
正则化系数 α \alpha α 10 10 10

将正则化系数 α \alpha α 改为 10 10 10,其余不变,重复实验。迭代了188次,得到近似解

alpha = 10;
fun = @(y) bpdual(y,A,b,alpha);
dist2 = [];
[y2, ~, ~, Out2]= fminLBFGS_Loop(y0, fun, opts);

AtY = A'*Out2.xitr;
C = max(min(AtY, 1),-1);
D = AtY - C;
X = alpha*D; % 1024*154 
for i = 1:size(X,2) % size(X,2):返回矩阵X的列数,k=154
    dist2 = [dist2;norm(X(:,i) - u,2)];
end

x2 = X(:,end);
feasi2 = norm(A*x2 - b);
k2 = length(dist2);
结果可视化

可视化每一步迭代对应的 x x x 与真实解 x ∗ x^* x 之间的距离。

fig = figure;
semilogy(0:k1-1, dist1, '-', 'Color',[0.2 0.1 0.99], 'LineWidth',2);
hold on
semilogy(0:k2-1, dist2, '-.','Color',[0.99 0.1 0.2], 'LineWidth',1.5);
legend('\alpha = 5', '\alpha = 10');
ylabel('$\|x - x_*\|_2$', 'fontsize', 14, 'interpreter', 'latex');
xlabel('迭代步');
title('L-BFGS算法解基追踪');
print(fig, '-depsc','bp_lbfgs.eps');
辅助函数

正则化问题的对偶问题的目标函数(及其梯度)。

function [f,g] = bpdual(y,A,b,alpha)

y y y 构造出 x x x ,并计算相应的误差。

Aty = A'*y;
c = max(min(Aty, 1),-1);
d = Aty - c;
x = alpha*d;

目标函数值和当前点处的梯度( nargout 表示当前函数在被调用时,需要的输出的个数, 这里表示当输出个数大于1时计算梯度)。

f = -b'*y + alpha/2*norm(d,2)^2;

if nargout > 1
    g = -b + A*x;
end
end
结果分析

上图展示了基追踪问题在迭代过程中的误差变化情况,当 α = 5 \alpha=5 α=5 α = 10 \alpha=10 α=10
时,正则化问题的解均非常接近真正的解;并观察到, 对于更大的正则化系数 α \alpha α 得到的解的精确性更好。

同时,我们发现当接近最优解时,算法呈现接近线性的收敛速度。
L-BFGS算法解基追踪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

眰恦I

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值