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 |

浙公网安备 33010602011771号