基于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

五、应用

  1. 推荐系统:补全用户-物品评分矩阵
  2. 医学影像:修复受损的MRI/CT图像
  3. 基因表达:填补缺失的基因测序数据
  4. 社交网络:预测用户关系网络中的缺失连接