c++求矩阵的秩_低秩稀疏矩阵恢复算法整理与仿真

ed64e41e50d6f18578e8bb10ba43d2fc.png

一曲新词酒一杯,去年天气旧亭台。夕阳西下几时回? 无可奈何花落去,似曾相识燕归来。小园香径独徘徊。 ———《浣溪沙·一曲新词酒一杯》——晏殊

更多精彩内容请关注微信公众号 “优化与算法

上一期介绍了低秩矩阵填充问题,这一期介绍一下低秩稀疏矩阵恢复问题。

1. 低秩矩阵恢复

将一个矩阵

分解为一个低秩矩阵部分
和一个独立同分布的高斯矩阵
的问题是经典的主成分分析(PCA)问题,可以通过对矩阵
进行奇异值分解得到最优解。

然而,当矩阵

为稀疏的噪声矩阵时,PCA不再适用于解决这个问题。此时 ,将一个矩阵
分解为一个低秩矩阵部分
和一个稀疏矩阵部分
的问题可以建模为下述优化问题:

其中

是观测矩阵。(1)式中
都是非线性且非凸的,优化起来非常困难,这个问题也被称为主成分追踪(Principal component pursuit, PCP)。幸运的是我们提前知道一些先验信息,即矩阵
是低秩的且矩阵
是稀疏的,从上一期介绍的关于矩阵填充理论中可知,矩阵的秩和
范数问题都可以进行凸松弛,从而为求解上述问题提供了途径。由于矩阵的核范数是矩阵秩的凸包络,矩阵的(1,1)范数是矩阵0范数的凸包络,因此可以将问题(1)松弛为如下凸优化问题:

求解式(2)也称为鲁棒主成分分析(RPCA)。

文献[1]中指出,只要低秩矩阵

的奇异值分布合理且稀疏矩阵的非零元素均匀分布,那么凸优化问题PCP就能够以接近1的概率从未知的任意误差中恢复出原始低秩矩阵
来。

求解(2)式的算法可以分为如下几大类:

  1. 迭代阈值算法 对于PCP问题时,迭代阈值算法(Iterative Thresholding, IT) 通过交替更新矩阵
    来求解。IT算法的迭代形式简单且收敛,但它的收敛速度比较慢,且难以选取合适的步长。因此,IT算法具有有限的应用范围。
  2. 加速近端梯度算法 加速近端梯度算法(Accelerated Proximal Gradient, APG)的主要思想是利用了Nesterov加速,使算法能够快速收敛。
  3. 对偶方法 将原问题转化为其对偶问题(非线性、非光滑),并使用最速上升法等可以求解。对偶方法比APG算法具有更好的可扩展性,这是因为在每次迭代过程中对偶方法不需要矩阵的完全奇异值分解。
  4. 增广拉格朗日乘子法

这些方法都非常经典,这里不再细述,总的来说,只要将问题转化为凸问题,就有一大堆方法可以用来求解。这里仅介绍一种增广拉格朗日乘子算法,即交替方向方法(Alternating direction methods, ADM),也称为不精确拉格朗日乘子法(Inexact ALM, IALM)。 下面给出上述几种算法的比较(数据来源于网络)

41f44716d81f4b8a9c1eac3533d773bb.png

2. 交替方向算法(ADM)

对于优化问题(2),首先构造增广拉格朗日函数:

时,使用交替方法求解块优化问题:

使用精确拉格朗日乘子法(Exact ALM, EALM)交替迭代矩阵

,直到满足终止条件为止。若
,则

再根据

更新矩阵

分别为
的精确值,则矩阵
的更新公式为:

参数

可以更新如下:

其中

为常数,
为一个小的正数。

上述精确ALM方法在内循环中要多次更新,进行多次奇异值分解,为此文献[1]提出了非精确拉格朗日乘子法(Inecact ALM, IALM),它不需要在每次外循环开始之前要求

的精确解,也就是去掉了ALM方法的内循环,其更新公式变成了如下形式:

上面式子中的奇异值阈值算子

和软阈值算子
的定义参见上一期<低秩矩阵填充|奇异值阈值算法>。

##4. 低秩矩阵恢复的应用 低秩矩阵恢复技术是一个非常有研究价值和实用价值的技术,它的应用也非常广泛,比如说:

  1. 视频背景建模。

829de098e4d7d9517d0a59e46b4f6f87.png
  1. 图像恢复(去光照、阴影等)

fca0e43036abf74c3c154be395bf0efa.png
  1. 图像类别标签净化
  2. 文本主题分析
  3. 音乐词曲分离
  4. 图像矫正与去噪

f240c182cb4b218029c4d7cf7cd3cd46.png
  1. 图像对齐

##5. 仿真

ADM算法matlab代码如下:

function [L,S] = pcp_ad(M,u,lambda,itemax,tol)
% solve PCP problem by ADM algorithm
% v1.0 2020-1-1
% function:solve the following optimization problem
%                  min  ||X||*+lambda||E||_F
%                  s.t. M = A+E

% initialize S0 and Y0 and L0
[m,n] = size(M) ;
S = zeros(m,n) ;
Y = S ;
L = S ;

% the observed matrix can contain non number
unobserved = isnan(M);
M(unobserved) = 0;

if nargin < 2
    lambda = 1 / sqrt(max(m,n));
end
if nargin < 3
    u = 10*lambda;
end
if nargin < 4
    tol = 1e-6;
end
if nargin < 5
    itemax = 1000;
end

for ii = 1:itemax
    L = sig_thre(M-S+(1/u)*Y,(1/u)) ;
    S = soft_thre(M-L+(1/u)*Y, lambda/u) ;
    Z = M-L-S ;
    Y = Y+u*Z ;
    error = norm(M-L-S,'fro')/norm(M,'fro') ;
    if (ii == 1) || (mod(ii, 10) == 0) || (error < tol)
        fprintf(1, 'iter: %04dterr: %ftrank(L): %dtcard(S): %dn', ...
            ii, error, rank(L), nnz(S));
    end
    if error<tol
        break;
    end
end

数值测试代码:


% solve PCP problem by alternating direction method
clear
clc

m = 100 ;
n = 100 ;
r = 0.05*n ;
rate = 0.05 ;
% Generating a low rank matrix
LL = randn(m,r)/sqrt(m)*randn(r,n)/sqrt(n) ;
% Generating a large sparse noise matrix (Bernoulli matrix)
SS = randi([0,1],m,n) ;
SS(SS==0) = -1 ;

% sampling
ss = SS(:) ;
index = sort(randperm(m*n,ceil(rate*n*m))) ;
ss1 = zeros(m*n,1) ;
ss1(index) = ss(index) ;
SS = reshape(ss1,m,n) ;
M = LL+SS ;

lambda = 1/sqrt(max(m,n)) ;
u = 10*lambda ;

% [L,S] = pcp_ad(M,u,lambda,1000) ;
[L,S] = RobustPCA(M,lambda,u);
% [L,S] = pcp_ad(M,u,lambda,500,1e-8);
% [L,S] = adm_lrr(M);
MM = M-L-S ;

norm(M-MM,'fro')/norm(M,'fro')
norm(M-L-S,'fro')/norm(M,'fro')
norm(L-LL,'fro')/norm(LL,'fro')
norm(S-SS,'fro')/norm(SS,'fro')

运行上面程序,显示结果norm(M-L-S,'fro')/norm(M,'fro')约为9e-7,norm(L-LL,'fro')/norm(LL,'fro')约为1e-5。

低秩图像恢复仿真程序:

% low rank and sparse noise image recovery
clear
clc

A = imread('C:xxxxxxxxx.bmp') ;

WW = double(A) ;
a1 = double(A(:,:,1)) ;
a2 = double(A(:,:,2)) ;
a3 = double(A(:,:,3)) ;
[M,N] = size(a1);
X = zeros(M,N,3);
    
for jj = 1:3
    lambda = 1*1 / sqrt(max(M,N)); 
    u =  1*lambda;
    [ X(:,:,jj),S(:,:,jj)] = RobustPCA(WW(:,:,jj),lambda,u,1e-8,200) ;
end

figure(1)
subplot(3,1,1)
imshow(A)
title("原图",'fontsize',12)
subplot(3,1,2)
imshow(uint8(X))
title("低秩图",'fontsize',12)
d = S ;
d(d<20) = 255 ;
subplot(3,1,3)
imshow(uint8(d))
title("噪声图",'fontsize',12)

低秩图像恢复结果如下:

d6ada80c74a6361b7dd60fd46919598f.png

5bb7753517ead3f105106a04b088e2d7.png

585de228a591b1efbba2edee74bfec20.png

cc75f94679476cbd8b4711224d01b894.png

daf1ec9bed4bc740fe862560586b718f.png

从上面图像恢复结果来看,效果还不错。

参考文献

[1] Candès, E. J., Li, X., Ma, Y., & Wright, J. (2011). Robust principal component analysis?. Journal of the ACM (JACM), 58(3), 11.

[2] 史加荣, 郑秀云, 魏宗田, & 杨威. (2013). 低秩矩阵恢复算法综述. 计算机应用研究, 30(6), 1601-1605.

[3] Cui, X., Huang, J., Zhang, S., & Metaxas, D. N. (2012, October). Background subtraction using low rank and group sparsity constraints. In European Conference on Computer Vision (pp. 612-625). Springer, Berlin, Heidelberg.

[4] Wright, J., Ganesh, A., Rao, S., Peng, Y., & Ma, Y. (2009). Robust principal component analysis: Exact recovery of corrupted low-rank matrices via convex optimization. In Advances in neural information processing systems (pp. 2080-2088).

[5] Peng, Y., Ganesh, A., Wright, J., Xu, W., & Ma, Y. (2012). RASL: Robust alignment by sparse and low-rank decomposition for linearly correlated images. IEEE transactions on pattern analysis and machine intelligence, 34(11), 2233-2246.

更多精彩内容请关注微信公众 “优化与算法

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值