ADMM(交替方向乘子法)算例

ADMM(交替方向乘子法)算例
目标:用 ADMM 解带约束的最小二乘问题(岭回归)
特点:结构简单、物理意义明确、方便扩展到 LASSO / 分布式优化


一、优化问题定义

原问题(带正则化的最小二乘)

\[\min_x \; \frac{1}{2}\|Ax - b\|_2^2 + \frac{\lambda}{2}\|x\|_2^2 \]

这是一个凸问题,有解析解,用来验证 ADMM 非常合适。


二、ADMM 形式改写

引入辅助变量 (z),把问题拆开:

\[\begin{aligned} \min_{x,z} \quad & \frac{1}{2}\|Ax - b\|_2^2 + \frac{\lambda}{2}\|z\|_2^2 \\ \text{s.t.} \quad & x - z = 0 \end{aligned}\]


三、增广拉格朗日函数

\[\mathcal{L}_\rho(x,z,u) = \frac{1}{2}\|Ax-b\|^2 + \frac{\lambda}{2}\|z\|^2\frac{\rho}{2}\|x-z+u\|^2 \]

其中:

  • \(u\):缩放形式的对偶变量
  • \(\rho\) > 0:惩罚参数

四、ADMM 迭代步骤

x-更新(最小二乘子问题)

\[x^{k+1} = \left(A^TA + \rho I\right)^{-1} \left(A^Tb + \rho(z^k - u^k)\right)\]

z-更新(解析解)

\[z^{k+1} = \frac{\rho}{\lambda + \rho}(x^{k+1} + u^k) \]

对偶变量更新

\[u^{k+1} = u^k + x^{k+1} - z^{k+1} \]


五、MATLAB 源代码

%% ADMM for Ridge Regression
clear; clc; close all;

%% ========== 问题参数 ==========
m = 50;          % 样本数
n = 10;          % 变量维度
A = randn(m, n);
b = randn(m, 1);
lambda = 1.0;    % 正则化系数
rho = 1.0;       % ADMM 惩罚参数

%% ========== ADMM 参数 ==========
maxIter = 200;
tol = 1e-6;
x = zeros(n,1);
z = zeros(n,1);
u = zeros(n,1);

%% 预计算(加速 x 更新)
AtA = A'*A;
Atb = A'*b;
invMat = (AtA + rho*eye(n)) \ eye(n);

%% ========== ADMM 主循环 ==========
residual = zeros(maxIter,1);

for k = 1:maxIter
    % ---- x 更新 ----
    x = invMat * (Atb + rho*(z - u));
    
    % ---- z 更新 ----
    z_old = z;
    z = (rho / (lambda + rho)) * (x + u);
    
    % ---- 对偶变量更新 ----
    u = u + x - z;
    
    % ---- 残差(收敛判据)----
    r = norm(x - z, 'fro');          % 原始残差
    s = norm(rho*(z - z_old), 'fro');% 对偶残差
    residual(k) = max(r, s);
    
    if residual(k) < tol
        fprintf('ADMM converges at iteration %d\n', k);
        break;
    end
end

%% ========== 结果对比 ==========
x_admm = x;

% 解析解(闭式)
x_closed = (A'*A + lambda*eye(n)) \ (A'*b);

fprintf('ADMM 解与解析解的误差: %.2e\n', norm(x_admm - x_closed));

%% ========== 收敛曲线 ==========
figure('Color','white')
semilogy(1:k, residual(1:k), 'b-o', 'LineWidth',1.5)
xlabel('Iteration')
ylabel('Residual')
title('ADMM Convergence Curve')
grid on

六、运行结果说明

  • ADMM 解 ≈ 解析解(误差通常在 1e-10 量级)
  • 残差单调下降,最终进入平台
  • 迭代次数一般在 20~100 次 收敛

参考代码 实现用ADMM算法求解优化问题的一个简单算例 www.youwenfan.com/contentcnw/82535.html

七、如何改成 LASSO(重要扩展)

只要把 z-更新 换成软阈值(Soft-thresholding):

z = soft_threshold(x + u, lambda/rho);
function y = soft_threshold(x, kappa)
    y = sign(x) .* max(abs(x) - kappa, 0);
end

此时问题变为:

\[\min_x \; \frac{1}{2}\|Ax-b\|^2 + \lambda\|x\|_1 \]

这是 压缩感知 / 稀疏恢复 的核心模型。


八、工程调参建议

参数 建议
ρ 一般取 0.1~10,太小收敛慢,太大震荡
自适应 ρ 根据原始/对偶残差动态调整
停止准则 `max(
大规模问题 x-更新用 CG / Cholesky
posted @ 2026-06-30 10:03  风一直那个吹  阅读(4)  评论(0)    收藏  举报