如何使用强大的PCA输出作为传统PCA的主成分(本征)向量

时间:2016-11-21 13:23:57

标签: python pca

我正在使用PCA来降低N维数据集的维数,但我想建立对大异常值的鲁棒性,所以我一直在研究强大的PCA代码。

对于传统的PCA,我使用python的sklearn.decomposition.PCA,它很好地将主要组件作为向量返回,然后我可以在其上投影我的数据(很明显,我已经还使用SVD编写了我自己的版本,所以我知道该方法是如何工作的)。我在那里找到了一些预先编码的RPCA python代码(如https://github.com/dganguli/robust-pcahttps://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"不是其他人如何使用/编码它?

1 个答案:

答案 0 :(得分:3)

robust-pca code将数据矩阵D分解为两个矩阵LS,它们是“低级别”和“稀疏”矩阵(请参阅{{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