RPCA矩阵分析与主成分追赶
矩阵分解
假设有一个很大的数据矩阵\(M\),他可以被分解为一个低秩矩阵\(L_0\) 和一个稀疏矩阵\(S_0\).
数学表达如下:
\[
M = L_0 + N_0
\]
分解方法如下:
\[
minimize \quad ||M - L|| \\
subject \ to \quad rank(L) \leq k
\]
\(||M|| \)就是矩阵的奇异值,因为矩阵可以被投影到不同的矩阵。
而解法就是减去M的主成分,也就是最大奇异值所重构的矩阵。
这样剩下的就一定会稀疏了。为什么会低秩?因为其基是一样的。
所以时间序列上的主成分就是背景。具体的用矩阵分解来做background subtraction如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57clear all
close all
clc
addpath('D:\projects\matrix\common');
addpath('D:\projects\matrix\common_c');
im_pa = 'D:\dataset\dataset2014\dataset\baseline\highway\input';
im_ft = 'jpg';
[files data] = loadData_plus(im_pa, im_ft);
[row_im column_im byte_im frames_im] = size(data);
data_gray = zeros(row_im, column_im, 1, frames_im);
for i = 1:frames_im
im = data(:, :, :, i);
data_gray(:, :, :, i) = grayImage(im);
end
data_gray = squeeze(data_gray);
data_bk = abs(data_gray - data_gray);
data_bkim = abs(data_gray - data_gray);
num = 1;
for i = 1:row_im
matrix = data_gray(i, :, :);
matrix = squeeze(matrix);
matrix = matrix';
[U S V] = svd(matrix);
matrix_ = U * S(:, 1:num) * V(:, 1:num)';
bkim = abs(matrix - matrix_);
bkim = bkim';
data_bk(i, :, :) = bkim;
data_bkim(i, :, :) = matrix_';
i
end
for i = 1:frames_im
im = data_bk(:, :, i);
bkim = data_bkim(:, :, i);
grayim = data_gray(:, :, i);
displayMatrixImage(i, 1, 3, grayim, im, bkim);
end