基于MATLAB的低秩矩阵填充实现
2025-12-15
基于MATLAB的低秩矩阵填充(Matrix Completion)实现
一、核心算法实现
1. 奇异值阈值(SVT)算法
function [X, iter] = svt_completion(M, tau, delta, tol, max_iter)
% 输入参数:
% M - 观测矩阵(含缺失值,用NaN表示)
% tau - 阈值参数
% delta - 步长参数
% tol - 收敛阈值
% max_iter - 最大迭代次数
% 初始化
[m,n] = size(M);
X = zeros(m,n);
Y = M;
iter = 0;
while iter < max_iter
iter = iter + 1;
% 奇异值分解
[U,S,V] = svd(Y,'econ');
S = diag(S);
% 软阈值操作
idx = S > tau;
S_thresh = S;
S_thresh(idx) = S(idx) - tau;
S_thresh(~idx) = 0;
% 更新X
X = U * S_thresh * V';
% 更新拉格朗日乘子
Y = Y + delta*(M - X);
% 检查收敛
rel_err = norm(M(X~=0) - X(X~=0),'fro')/norm(M(X~=0),'fro');
if rel_err < tol
break;
end
end
end
2. 加速近端梯度(APG)算法
function [X] = apg_completion(M, rank, mu, rho, max_iter)
% 输入参数:
% M - 观测矩阵
% rank - 秩估计值
% mu - 步长参数
% rho - 增量因子
[m,n] = size(M);
X = zeros(m,n);
Z = zeros(m,n);
L = svd(M,'econ');
L = L(:,1:rank);
for iter = 1:max_iter
% 更新X
X = prox_l1(Z + (1/mu)*(M - Z), 1/mu);
% 更新Z
[U,S,V] = svd(X - Z/mu + (1/mu)*L,'econ');
S = diag(S);
S = max(S - mu, 0);
Z = U*S*V';
% 更新L
L = L + mu*(X - Z);
% 检查收敛
rel_err = norm(M(X~=0) - X(X~=0),'fro')/norm(M(X~=0),'fro');
if rel_err < 1e-5
break;
end
end
end
function Z = prox_l1(Y, tau)
Z = max(Y - tau, 0) - max(-Y - tau, 0);
end
二、完整应用示例
1. 合成数据测试
% 生成低秩矩阵
true_rank = 5;
[m,n] = [1000,800];
A = randn(m,true_rank) * randn(true_rank,n);
% 生成观测矩阵(50%缺失)
mask = rand(m,n) > 0.5;
M = A .* mask;
% 填充参数设置
rank = 5;
mu = 1.2/norm(A,'fro');
rho = 1.1;
max_iter = 1000;
% 执行APG算法
tic;
X = apg_completion(M, rank, mu, rho, max_iter);
toc;
% 计算误差
error = norm(A - X,'fro')/norm(A,'fro');
disp(['恢复误差:', num2str(error)]);
2. 实际图像恢复
% 加载图像
img = imread('lena.png');
img_gray = rgb2gray(img);
img_mat = double(img_gray)/255;
% 生成观测矩阵(随机缺失30%)
mask = rand(size(img_mat)) > 0.3;
M = img_mat .* mask;
% 执行SVT算法
tic;
[X, iter] = svt_completion(M, 50, 1.2, 1.05, 500);
toc;
% 显示结果
figure;
subplot(1,2,1); imshow(M); title('观测矩阵');
subplot(1,2,2); imshow(X); title('恢复图像');
三、参数调优
| 参数 | 作用范围 | 推荐值 | 调优方法 |
|---|---|---|---|
| 秩估计 | 矩阵分解 | 5-50 | 奇异值谱分析 |
| 步长μ | 梯度下降 | 1-10 | 线搜索(Armijo条件) |
| 阈值τ | SVT算法 | 1-100 | 基于奇异值分布 |
| 最大迭代 | 所有算法 | 500-2000 | 早停机制(误差变化<1e-5) |
| 并行线程数 | 加速计算 | 4-8 | 根据CPU核心数设置 |
四、性能指标
% 计算多种误差指标
function metrics = evaluate_recovery(A, X, mask)
% 基本指标
metrics.fro_error = norm(A - X, 'fro') / norm(A, 'fro');
% 鲁棒指标
metrics.relative_error = norm(A(mask) - X(mask), 'fro') / norm(A(mask), 'fro');
% 结构相似性
metrics.SSIM = ssim(X, A);
% 信息损失
metrics.mse = mean((A(mask) - X(mask)).^2);
end
参考代码 各种低秩约束矩阵填充方法 www.3dddown.com/csa/78960.html
五、应用
- 推荐系统:补全用户-物品评分矩阵
- 医学影像:修复受损的MRI/CT图像
- 基因表达:填补缺失的基因测序数据
- 社交网络:预测用户关系网络中的缺失连接
