最近读了LLR(Low Rank Representation)的文章,所以整理一下。本文的主线是LLR-->LantLLR-->RobustLLR
************ 代码我已经下载了,也就直接贴出来了~~~~~***********
%% Latent Low-Rank Representation
function [Z,L,E] = latent_lrr(X,lambda)
% Latent Low-Rank Representation for Subspace Segmentation and Feature Extraction
% Guangcan Liu, Shuicheng Yan. ICCV 2011.
% Problem:
% min_Z,L,E ||Z||_* + ||L||_* +¡¡lambda||E||_1,
% s.t. X = XZ + LX +E.
% Solning problem by Inexact ALM
A = X;
tol = 1e-6;
rho = 1.1;
max_mu = 1e6;
mu = 1e-6;
maxIter = 1e6;
[d n] = size(X);
m = size(A,2);
atx = X'*X;
inv_a = inv(A'*A+eye(m));
inv_b = inv(A*A'+eye(d));
%% Initializing optimization variables
J = zeros(m,n);
Z = zeros(m,n);
L = zeros(d,d);
S = zeros(d,d);
% E = sparse(d,n);
E = zeros(d,n);
Y1 = zeros(d,n);
Y2 = zeros(m,n);
Y3 = zeros(d,d);
%% Start main loop
iter = 0;
disp('initial');
while iter<maxIter
iter = iter + 1;
% disp(['iter====>>>>' num2str(iter)]);
%updating J by the Singular Value Thresholding(SVT) operator
temp_J = Z + Y2/mu;
[U_J,sigma_J,V_J] = svd(temp_J,'econ');
sigma_J = diag(sigma_J);
svp_J = length(find(sigma_J>1/mu));
if svp_J>=1
sigma_J = sigma_J(1:svp_J)-1/mu;
else
svp_J = 1;
sigma_J = 0;
end
J = U_J(:,1:svp_J)*diag(sigma_J)*V_J(:,1:svp_J)';
%updating S by the Singular Value Thresholding(SVT) operator
temp_S = L + Y3/mu;
[U_S,sigma_S,V_S] = svd(temp_S,'econ');
sigma_S = diag(sigma_S);
svp_S = length(find(sigma_S>1/mu));
if svp_S>=1
sigma_S = sigma_S(1:svp_S)-1/mu;
else
svp_S = 1;
sigma_S = 0;
end
S = U_S(:,1:svp_S)*diag(sigma_S)*V_S(:,1:svp_S)';
%udpate Z
Z = inv_a*(atx-X'*L*X-X'*E+J+(X'*Y1-Y2)/mu);
%udpate L
L = ((X-X*Z-E)*X'+S+(Y1*X'-Y3)/mu)*inv_b;
%update E
xmaz = X-X*Z-L*X;
temp = xmaz+Y1/mu;
E = max(0,temp - lambda/mu)+min(0,temp + lambda/mu);
leq1 = xmaz-E;
leq2 = Z-J;
leq3 = L-S;
max_l1 = max(max(abs(leq1)));
max_l2 = max(max(abs(leq2)));
max_l3 = max(max(abs(leq3)));
stopC1 = max(max_l1, max_l2);
stopC = max(stopC1, max_l3);
if stopC<tol
disp('LRR done.');
break;
else
Y1 = Y1 + mu*leq1;
Y2 = Y2 + mu*leq2;
Y3 = Y3 + mu*leq3;
mu = min(max_mu,mu*rho);
end
end
end
一、低秩表示
刚开始接触低秩表示是看到一篇论文里面对公式进行了低秩约束,感觉很好奇,查了一下后,发现低秩很神奇,可以将噪声和干净数据自动分割出来。因为这一部分比较基础所以参考一篇中文论文[1]
稀疏表示也是将数据集矩阵表示成字典的线性组合,但是不同的是稀疏表示希望系数是稀疏的。
举例:
可以把Ui理解为空间里的基,然后Q是系数,相当于坐标点,20个4维的坐标点。X是100个数据,随机选20个加噪声,最后用低秩表示,可以看到相似度矩阵的块效应非常显著,这个和定义的5个子空间是吻合,这说明,对子空间的分割具有鲁棒性,同时可以看到近乎完美的恢复了噪声,所以具有良好的去噪性。
二、低秩子空间恢复的联合稀疏表示
本部分参考的论文也是一篇中文论文[2]
最后计算测试样本对各类训练样本的残差,测试样本属于残差最小的那个类。
三、Latent Low-Rank Representation(LatLLR)[3]
下面按照这两个问题讨论
1)无噪声数据
先给出一个定理并证明
接下来还是用举例证明
一共是10个空间,选择了9个所以样本是不充分的,但是我们使用lantLLR,从效果可以看出能鲁棒的分割出9个子空间,其中b图因为是不充分的LLR只能是对角线为1矩阵。
本例中样本是充分的,只是在噪声不同的情况下,比较LLR和LatLLR
最后一部分是在真实场景中的实验应用
三种不同的点代表不同的空间,红色左右转,蓝色的上下转,黄色的不动。
整个视频序列是29帧,459个点,3个motion,一个motion对应一个子空间
[1]史加荣,低秩矩阵恢复算法综述,[J]计算机应用研究,2013
[2]胡正平,基于低秩子空间恢复的联合稀疏表示人脸识别算法,[J]电子学报,2013
[3]Guangcan Liu, Latent Low-Rank Representation for Subspace Segmentation and Feature Extraction,ICCV,2011
代码地址:https://download.csdn.net/download/smilebluesky/10555664