如何将鲁棒主成分分析的输出用作传统主成分分析的主成分(特征向量)

8
我正在使用PCA来降低一个N维数据集的维度,但我想要加入对大离群值的鲁棒性,所以我一直在寻找Robust 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个三维点云。我对其进行PCA处理:
pca=sklean.decompose.PCA(n_components=3)
pca.fit(X)
comps=pca.components_

这3个组件是3D向量,定义了新基准,我将所有点投影到该基准上。使用Robust PCA,我得到矩阵L+S=X。那么是否需要运行pca.fit(L)?我本以为RPCA会给我返回特征向量,但在构建协方差矩阵或执行SVD的过程中,它有内部步骤来排除异常值。
也许我所谓的“Robust PCA”并不是其他人使用/编码的方式?

我认为如果您解释一下将这些矩阵连接到标准 PCM 算法的向量的问题,会更有帮助。 - ImportanceOfBeingErnest
我添加了问题以使其更清晰。 - AstroBen
1个回答

13
robust-pca代码将数据矩阵D分解为两个矩阵:LS,它们是“低秩”和“稀疏”矩阵(有关详细信息,请参见论文)。L在各种观测之间大部分是恒定的,而S则是变化的。在该论文的第2和第3图中,有一个非常好的例子来自一些安全摄像头,可以挑选出静态背景(L)和可变性,例如通过行人(S)。
如果您只想要特征向量,请将S视为垃圾(您想裁剪的“大异常值”),并对L矩阵进行特征值分解。
以下是使用robust-pca代码的示例:
    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: https://dev59.com/qWYs5IYBdhLWcg3wAfEi#13224592

    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

你能否解释一下在什么情况下应该优先选择这个强健的PCA而不是普通的PCA?或者是否有一些方便的信息或来源可以提供? - Ben
@Ben 当您预计输入可能存在异常值时,请使用鲁棒PCA。请参考我引用的论文中的示例。 - Paul Price
1
您能否添加一下这篇论文的标题呢?链接已经失效了。 - rocksNwaves
这是代码 README.md 中引用的论文。我修复了链接。 - Paul Price

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接