Candes E J, Li X, Ma Y, et al. Robust principal component analysis[J]. Journal of the ACM, 2011, 58(3).

这篇文章,讨论的是这样的一个问题:

\[M = L_0 + S_0
\]

有这样的一个矩阵\(M \in \mathbb{R}^{n_1 \times n_2}\),它由一个低秩的矩阵\(L_0\)和稀疏矩阵\(S_0\)混合而成,那么,能否通过\(M\)将\(L_0\)和\(S_0\)分别重构出来?而且,最关键的是,也是这篇文章的亮点所在:对于\(L_0\)和\(S_0\)仅有一丢丢的微弱的假设。

一些微弱的假设:

关于\(L_0\):

低秩矩阵\(L_0\)不稀疏,这个假设很弱,但有意义。因为如果\(M=e_1e_1^*\)(文章采用\(*\)作为转置符号,这里沿用这种写法),即只有左上角第一个元素非零,那么这个矩阵如何分解为低秩和稀疏呢,因为压根没法区分。作者引入incoherence condition(不连贯条件?抱歉,不晓得如何翻译):

假设\(L_0\)的SVD分解为:

\[L_0 = U\Sigma V^*=\sum \limits_{i=1}^r \sigma_i u_i v_i^*
\]

其中\(r = \mathrm{rank}(L_0)\),\(\sigma_i\)为奇异值,并且,\(U = [u_1, \ldots, u_r]\),\(V = [v_1, \ldots, v_r]\)。

incoherence condition:



分析这些条件可以发现,\(U,V\)的每一行的模都不能太大,\(UV^*\)的每个元素同样不能太大,所以最后结果\(L_0\)的各个元素的大小会比较均匀,从而保证不稀疏?

关于\(S_0\):

类似地,需要假设\(S_0\)不低秩,论文另辟蹊径,假设\(S_0\)的基为\(m=\mathrm{Card}(S_0)\),其支撑(support)定义为:

\[\Omega = \{(i,j)| [S_0]_{i,j} \ne 0\}
\]

论文假设\(S_0\)的支撑\(\Omega\)从一个均匀分布采样。即,\(S_0\)不为零的项为\(m\),从\(n_1\times n_2\)个元素中挑选\(m\)个非零的组合有\(\mathrm{C}_{n_1 \times n_2}^m\),论文假设每一种组合被采样的概率都是相同的。事实上,关于\(S_0\)元素的符号,论文在后面说明,符号固定或者随机(服从伯努利分布),都能将\(L_0,S_0\)恢复出来。

问题的解决

论文反复强调,多么令人惊讶,多么不可思议,事实上的确如此,上述问题只需求解一个形式非常简单的凸优化问题:



其中\(\|L\|_* = \sum \limits_{i=1}^r \sigma_i(L)\)为其核范数。

论文给出了以下结论:





即:令\(n_{(1)}= \max(n_1, n_2), n_{(2)} = \min (n_1, n_2)\),对于任意矩阵\(M = L_0 + S_0 \in \mathbb{R}^{n_1 \times n_2}\),只要\(L_0\)和\(S_0\)满足上面提到的假设,那么就存在常数\(c\)使得,PCP的解(即(1.1)的解,且\(\lambda= 1/ \sqrt{n_{(1)}}\))\(\hat{L}\)和\(\hat{S}\)有\(1-c n_{(1)}^{-10}\)的概率重构\(L_0\),\(S_0\),即\(\hat{L}=L_0\),\(\hat{S}=S_0\)。并且有下列性质被满足\(\mathrm{rank}(L_0) \le \rho_r n_{(2)} \mu^{-1} (\log n_{(1)})^{-2},m \le \rho_s n_1 n_2\)。

这个结果需要说明的几点是,常数\(c\)是根据\(S_0\)的支撑\(\Omega\)决定的(根据后面的理论,实际上是跟\(\|\mathcal{P}_{\Omega} \mathcal{P}_{T}\|\)有关),另外一点是,\(\lambda = 1 / \sqrt{n_{(1)}}\)。是的,论文给出了\(\lambda\)的选择(虽然这个选择不是唯一的),而且,这个值是通过理论分析得到的。

关于问题 (1.1)的求解有很多现成的算法,这篇论文大量篇幅用于证明上述的理论结果,只在最后提到利用ALM(Augmented Largrange multiplier)方法有很多优势,算法如下:



其中\(\mathcal{S}_{\tau}[x] = \mathrm{sgn} (x) \max (|x| - \tau, 0)\), \(\mathcal{D}_{\tau} (X)=U\mathcal{S}_{\tau}(\Sigma)V^*,X=U\Sigma V^*\)。

ALM算法实际上是交替最小化下式:



其中\(<A, B>:= \mathrm{Tr(A^TB)}\)。

固定\(L, Y\),实际上就是最小化:

\[\min \quad \lambda \|S\|_1 + <Y, -S> + \frac{\mu}{2}\mathrm{Tr}(S^TS -2S^T(M-L))
\]

其在\(S\)处的导数(虽然有些点并不可导)为:

\[\lambda \mathrm{sgn}(S) - Y + \mu S-\mu(M-L)
\]

实际上,对于每个\(S_{i,j}\),与其相关的为:

\[a S_{i, j}^2 + b S_{i,j}+c|S_{i,j}|, \alpha > 0
\]

关于最小化这个式子,我们可以得到:

\[S_{i,j}= \left \{ \begin{array}{ll}
-\frac{b+c}{2a} & -\frac{b+c}{2a} \ge 0 \\
-\frac{b-c}{2a} & -\frac{b-c}{2a} \le 0 \\
0 & else
\end{array} \right.
\]

实际上就是\(S_{i,j}= \mathcal{S}_{c/2a}(-b/2a)\),对\(S\)拆解,容易得到固定\(L,Y\)的条件下,\(S\)的最优解为:

\[\mathcal{S}_{\lambda / \mu}(M-L+\mu^{-1}Y)
\]

当\(S, Y\)固定的时候:

实际上就是最小化下式:

\[\|L\|_* + <Y, -L> + \frac{\mu}{2} \mathrm{Tr(L^TL-L^T(M-S))}
\]

观测其次梯度:

\[UV^*+W-Y+\mu L - \mu(M-S)
\]

其中\(L=U\Sigma V^*,U^*W=0,WV=0,\|W\| \le 1\),\(\|X\|\)为\(X\)的算子范数。

最小值点应当满足\(0\)为其次梯度,即:

\[L = -\mu^{-1}UV^*-\mu^{-1}W+\mu^{-1}Y + M-S
\]

有解。

令\(A = M-S+\mu^{-1}Y\)

则:

\[L = -\mu^{-1}UV^*-\mu^{-1}W+A \\
\Rightarrow \Sigma=-\mu^{-1}I+U^*AV
\]

假设\(A=U_A\Sigma_A V_A^*\),那么:

\[\Sigma=-\mu^{-1}I+U^*U_A\Sigma_A V_A^*V
\]

如果我们令\(U=U_A,V=V_A\),则:

\[\Sigma = \Sigma_A-\mu^{-1}I
\]

但是我们知道,\(\Sigma\)的对角元素必须大于等于0,所以我可以这样构造解:

假设\(\Sigma_A\)的对角元素,即奇异值降序排列\(\sigma_1(A) \ge \sigma_2(A) \ldots \sigma_k(A) \ge \mu^{-1} > \sigma_{k+1}(A) \ge \ldots \ge \sigma_r(A)\),相对于的向量为\(u_1(A),\ldots,u_r(A)\)和\(v_1{A},\ldots, v_r(A)\)。我们令

\[L=\sum \limits_{i=1}^k (\sigma_i(A)-\mu^{-1})u_i(A)v_i^T(A) \\
W = \sum \limits_{i=k+1}^{r} \mu \sigma_i(A)u_i(A)v_i^T(A)
\]

容易验证\(U^*W=0,WV=0\),又\(\mu^{-1} > \sigma_i(A), i > k\),所以\(\mu \sigma_i(A) < 1\),所以\(\|W\| \le 1\)也满足。同样的,次梯度为0的等式也满足,所以\(L\)就是我们要找到点(因为这个是凸函数,极值点就是最小值点)。

理论

这里只介绍一下论文的证明思路。

符号:

去随机

论文先证明,如果\(S_0\)的符号是随机的(伯努利分布),在这种情况能恢复,那么\(S_0\)的符号即便不随机也能恢复。

Dual Certificates(对偶保证?)

引理2.4

引理2.4告诉我们,只要我们能找到一对\((W, F)\),满足\(UV^*+W=\lambda(sgn(S_0)+F)\)。\((L_0,S_0)\)是优化问题(1.1)的唯一解。但是不够,因为这个条件太强了,\(W, F\)的构造是困难的。

引理2.5

进一步改进,有了引理2.5。



引理2.5的意义在哪呢?它意味着,我们只要找到一个\(W\),满足:



那么,\((L_0,S_0)\)就是问题\((1.1)\)的最优解,而且是唯一的。

Golfing Scheme

接下来,作者介绍一种机制来构造\(W\),并且证明这种证明能够大概率保证\(W\)能够满足上述的对偶条件。作者将\(W = W^L + W^S\)分解成俩部分,俩部分用不同的方式构造:



接下的引理和推论,总结起来便是最后的证明:









通过引理2.8和2.9,再利用范数的三角不等式,容易验证\(W = W^L+W^S\)满足对偶条件。

最后提一下,定理的概率体现在哪里,在对偶条件的引理中,有这么一个假设\(\|\mathcal{P}_{\Omega}\mathcal{P}_T\| \le 1\)和\(\|\mathcal{P}_{\Omega}\mathcal{P}_T\| \le 1/2\),这些条件并不一定成立,根据\(\Omega\)的采样,成立的大概率的。

数值实验

按照论文里,普通的人工生成矩阵,实验下来和论文的无异。也的确,\(S_0\)的规模大小(每个元素的大小)对能否恢复几乎没有影响,有影响的是\(S_0\)的稀疏度。实验下来,稀疏度越高(0基越小),恢复的越好,而且差距蛮大的。

我们的实验,\(L = XY\),其中\(X,Y \in \mathbb{R}^{500 \times 25}\)依标准正态分布生成的,\(S_0\)是每个元素有\(\rho\)的概率为\(100\),\(\rho\)的概率为\(-1\),\(1-2\rho\)的概率为0。\(\rho\)我们选了\(1/10, 1/15, \ldots, 1/55\)。

下面的图,红色表示\(\|\hat{L}-L_0\|_F/\|L_0\|_F\),蓝色表示\(\|\hat{S}-S_0\|_F/\|S_0\|_F\)。因为每种情况我只做了一次实验,所以结果有起伏,但是趋势是在的。

比较有意思的是图片的拆解,我在马路上拍了31张照片,按照论文的解释,通过将照片拉成向量,再混合成一个矩阵\(M\),然后通过优化问题解出\(\hat{L}\)和\(\hat{S}\),那么\(\hat{L}\)的行向量(我做实验的时候是将一个照片作为一个行向量,论文里的是列向量)重新展成图片应该是类似背景的东西,而\(\hat{S}\)中对应的行向量应该是原先图片中会动的东西。

照片我进行了压缩(\(416 \times 233\))和灰度处理,处理\(M\)用了1412次迭代,时间大概15分钟?比我预想的快多了。

我挑选其中比较混乱的图(就是车比较多的):

第一组:

M:



L:



S:



第二组:

M:

L:



S:



第三组:

M:



L:



S:



比较遗憾的是,\(\hat{S}\)中都出现了面包车,我以为面包车会没有的,结果还是出现了。

代码


"""
Robust Principal Component Analysis?
""" import numpy as np class RobustPCA: def __init__(self, M, delta=1e-7):
self.__M = np.array(M, dtype=float)
self.__n1, self.__n2 = M.shape
self.S = np.zeros((self.__n1, self.__n2), dtype=float)
self.Y = np.zeros((self.__n1, self.__n2), dtype=float)
self.L = np.zeros((self.__n1, self.__n2), dtype=float)
self.mu = self.__n1 * self.__n2 / (4 * self.norm_l1)
self.lam = 1 / np.sqrt(max(self.__n1, self.__n2))
self.delta = delta @property
def norm_l1(self):
"""返回M的l1范数"""
return np.sum(np.abs(self.__M)) @property
def stoprule(self):
"""停止准则"""
A = (self.__M - self.L - self.S) ** 2
sum_A = np.sqrt(np.sum(A))
bound = np.sqrt(np.sum(self.__M ** 2))
if sum_A <= self.delta * bound:
return True
else:
return False
def squeeze(self, A, c):
"""压缩"""
if c <= 0:
return A
B1 = np.where(np.abs(A) < c)
B2 = np.where(A >= c)
B3 = np.where(A <= -c)
A[B1] = [0.] * len(B1[0])
A[B2] = A[B2] - c
A[B3] = A[B3] + c
return A def newsvd(self, A):
def sqrt(l):
newl = []
for i in range(len(l)):
if l[i] > 0:
newl.append(np.sqrt(l[i]))
else:
break
return np.array(newl)
m, n = A.shape
if m < n:
C = A @ A.T
l, u = np.linalg.eig(C)
s = sqrt(l)
length = len(s)
u = u[:, :length]
D_inverse = np.diag(1 / s)
vh = D_inverse @ u.T @ A
return u, s, vh
else:
C = A.T @ A
l, v = np.linalg.eig(C)
s = sqrt(l)
length = len(s)
v = v[:, :length]
D_inverse = np.diag(1 / s)
u = A @ v @ D_inverse
return u, s, v.T def update_L(self):
"""更新L"""
A = self.__M - self.S + self.Y / self.mu
u, s, vh = np.linalg.svd(A) #or self.newsvd(A)
s = self.squeeze(s, 1 / self.mu)
s = s[np.where(s > 0)]
length = len(s)
if length is 0:
self.L = np.zeros((self.__n1, self.__n2), dtype=float)
elif length is 1:
self.L = np.outer(u[:, 0] * s[0], vh[0])
else:
self.L = u[:, :length] * s @ vh[:length] def update_S(self):
"""更新S"""
A = self.__M - self.L + self.Y / self.mu
self.S = self.squeeze(A, self.lam / self.mu) def update_Y(self):
"""更新Y"""
A = self.__M - self.L - self.S
self.Y = self.Y + self.mu * A def process(self):
count = 0
while not (self.stoprule):
count += 1
assert count < 10000, "something wrong..."
self.update_L()
self.update_S()
self.update_Y()
print(count)

注意到,我自己写了一个newsvd的方法,这是因为,在处理图片的时候,用numpy的np.linalg.svd会报memoryerror,所以就自己简单调整了一下。

Robust Principal Component Analysis?(PCP)的更多相关文章

  1. 吴恩达机器学习笔记49-主成分分析问题(Principal Component Analysis Problem Formulation)

    主成分分析(PCA)是最常见的降维算法. 在PCA 中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小.方 ...

  2. Sparse Principal Component Analysis via Rotation and Truncation

    目录 对以往一些SPCA算法复杂度的总结 Notation 论文概述 原始问题 问题的变种 算法 固定\(X\),计算\(R\) 固定\(R\),求解\(X\) (\(Z =VR^{\mathrm{T ...

  3. PCA(Principal Component Analysis)主成分分析

    PCA的数学原理(非常值得阅读)!!!!   PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可 ...

  4. (4)主成分分析Principal Component Analysis——PCA

    主成分分析Principal Component Analysis 降维除了便于计算,另一个作用就是便于可视化. 主成分分析-->降维--> 方差:描述样本整体分布的疏密,方差越大-> ...

  5. 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理

    0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...

  6. 《principal component analysis based cataract grading and classification》学习笔记

    Abstract A cataract is lens opacification caused by protein denaturation which leads to a decrease i ...

  7. Probabilistic Principal Component Analysis

    目录 引 主要内容 EM算法求解 附录 极大似然估计 代码 Tipping M E, Bishop C M. Probabilistic Principal Component Analysis[J] ...

  8. Principal Component Analysis(PCA) algorithm summary

    Principal Component Analysis(PCA) algorithm summary mean normalization(ensure every feature has sero ...

  9. Principal Component Analysis(PCA)

    Principal Component Analysis(PCA) 概念 去中心化(零均值化): 将输入的特征减去特征的均值, 相当于特征进行了平移, \[x_j - \bar x_j\] 归一化(标 ...

随机推荐

  1. 爬虫须知的HTTP协议

    HTTP请求: 1.HTTP请求主要分为"Get"和"Post"两种方法. 2.当我们在浏览器输入URL http://www.baidu.com 的时候, 浏 ...

  2. Tesseract 在 windows 下的安装及简单应用

    Tesseract 是一个开源的 OCR 引擎,可以识别多种格式的图像文件并将其转换成文本,最初由 HP 公司开发,后来由 Google 维护.下载地址:https://digi.bib.uni-ma ...

  3. SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  4. RAID磁盘阵列及CentOS7系统启动流程(week2_day3)--技术流ken

    RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 磁盘阵列是由很多价格较便宜的磁盘,以硬件( ...

  5. DSAPI 导出EXEDLL函数到字符串

    EXE或者DLL写好了,要开始写函数说明文档了,可是有时里面的函数太多,怎么能自动列出来呢?在DSAPI中提供了该功能(目前没有做参数类型导出,以后有时间会添加). 先准备一个已经写好的EXE或DLL ...

  6. Redis分布式队列和缓存更新

    原文链接:https://www.cnblogs.com/hua66/p/9600085.html 在使用Redis中,我们可能会遇到以下场景: 例如: 某用户向服务器中发送一个请求,服务器将用户请求 ...

  7. Mysql 的 create as 和create like 区别

    大家可能使用Navicat Premium时发现很方便,比如复制表或数据结构等,其实这种复制表数据或结构方法就是create table as 和create table like 这种方式实现细心的 ...

  8. Linux系列

    Linux入门及进阶学习. 目录 Linux的安装 GNOME图形界面的基本操作 命令行BASH的基本操作 Linux文件系统的基本结构 Linux文件基本操作管理 Linux系统目录架构 Linux ...

  9. Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?

    Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...

  10. 小程序应用的Python服务器部署高配,依然是腾讯云秒杀阿里云!

    上一篇文章,“小程序创业最低配置部署,腾讯云折扣秒杀阿里云!”介绍了小程序项目启动时的最低配置服务器选择,但当项目良好发展时,还是要把服务器配置调整到标准水平,承受住日益增长的流量访问. 随着Pyth ...