我正在使用PCA来降低N维数据集的维数,但我想建立对大异常值的鲁棒性,所以我一直在研究强大的PCA代码。
对于传统的PCA,我使用python的sklearn.decomposition.PCA,它很好地将主要组件作为向量返回,然后我可以在其上投影我的数据(很明显,我已经还使用SVD编写了我自己的版本,所以我知道该方法是如何工作的)。我在那里找到了一些预先编码的RPCA python代码(如https://github.com/dganguli/robust-pca和https://github.com/jkarnows/rpcaADMM)。
第一个代码基于Candes等人。 (2009)方法,并返回数据集D的低秩L和稀疏S矩阵。第二代码使用ADMM矩阵分解方法(Parikh,N。,& Boyd,S。2013)并返回X_1,X_2,X_3矩阵。我必须承认,我很难弄清楚如何将这些连接到标准PCM算法返回的主轴上。有人可以提供任何指导吗?
具体来说,在一个数据集X中,我有一个N个3-D点的云。我通过PCA运行它:
pca=sklean.decompose.PCA(n_components=3)
pca.fit(X)
comps=pca.components_
这三个组成部分是三维矢量,它定义了我投射所有观点的新基础。使用Robust PCA,我得到矩阵L + S = X.然后运行pca.fit(L)吗?我本以为RPCA会给我回到特征向量,但有内部步骤可以抛出异常值,作为构建协方差矩阵或执行SVD的一部分。
也许我的想法是"健壮的PCA"不是其他人如何使用/编码它?
答案 0 :(得分:3)
robust-pca
code将数据矩阵D
分解为两个矩阵L
和S
,它们是“低级别”和“稀疏”矩阵(请参阅{{3}详情)。 L
是各种观察之间基本不变的,而S
是变化的。 the paper中的图2和图3给出了几个安全摄像头的一个非常好的例子,选择静态背景(L
)和变量,例如传递人(S
)。
如果您只想要特征向量,请将S
视为垃圾(您希望剪掉的“大异常值”)并对L
矩阵进行特征分析。
以下是使用the paper:
的示例 L, S = RPCA(data).fit()
rcomp, revals, revecs = pca(L)
print("Normalised robust eigenvalues: %s" % (revals/np.sum(revals),))
此处,pca
功能为:
def pca(data, numComponents=None):
"""Principal Components Analysis
From: http://stackoverflow.com/a/13224592/834250
Parameters
----------
data : `numpy.ndarray`
numpy array of data to analyse
numComponents : `int`
number of principal components to use
Returns
-------
comps : `numpy.ndarray`
Principal components
evals : `numpy.ndarray`
Eigenvalues
evecs : `numpy.ndarray`
Eigenvectors
"""
m, n = data.shape
data -= data.mean(axis=0)
R = np.cov(data, rowvar=False)
# use 'eigh' rather than 'eig' since R is symmetric,
# the performance gain is substantial
evals, evecs = np.linalg.eigh(R)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]
if numComponents is not None:
evecs = evecs[:, :numComponents]
# carry out the transformation on the data using eigenvectors
# and return the re-scaled data, eigenvalues, and eigenvectors
return np.dot(evecs.T, data.T).T, evals, evecs