如何使用稳健的 PCA 输出作为传统 PCA 的主成分(特征)向量

Posted

技术标签:

【中文标题】如何使用稳健的 PCA 输出作为传统 PCA 的主成分(特征)向量【英文标题】:How to use Robust PCA output as principal-component (eigen)vectors from traditional PCA 【发布时间】:2017-04-04 21:53:54 【问题描述】:

我正在使用 PCA 来降低 N 维数据集的维数,但我想增强对大型异常值的鲁棒性,因此我一直在研究 Robust 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_

这 3 个组件是 3-D 向量,定义了我将所有点投影到的新基础。使用稳健的 PCA,我得到矩阵 L+S=X。然后运行 ​​pca.fit(L) 吗?我原以为 RPCA 会给我返回特征向量,但在构建协方差矩阵或执行 SVD 时有内部步骤来抛出异常值。

也许我认为的“强大的 PCA”不是其他人使用/编码的方式?

【问题讨论】:

如果您能解释将这些矩阵连接到标准 PCM 算法的向量的问题是什么,我认为这会有所帮助。 我添加到问题中是为了更清楚。 【参考方案1】:

robust-pca code 将数据矩阵 D 分解为两个矩阵,LS,它们是“低秩”和“稀疏”矩阵(有关详细信息,请参阅 the paper)。 L 是各种观察之间基本不变的,而 S 是变化的。 the paper 中的图 2 和图 3 给出了一个非常好的示例,来自几个安全摄像头,挑选出静态背景 (L) 和可变性,例如过往的人 (S)。

如果您只想要特征向量,请将 S 视为垃圾(您想要剔除的“大异常值”)并对 L 矩阵进行特征分析。

这是一个使用robust-pca code的例子:

    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://***.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

【讨论】:

您能否解释一下何时应该更喜欢这种强大的 pca 而不是普通的 pca?还是有一些方便的信息或来源? @Ben 当您预计输入可能有异常值时,请使用稳健的 PCA。看看我引用的论文作为一个例子。 您介意添加论文的标题吗?链接失效了。 代码是README.md中引用的论文。我修复了链接。

以上是关于如何使用稳健的 PCA 输出作为传统 PCA 的主成分(特征)向量的主要内容,如果未能解决你的问题,请参考以下文章

用于数据减少的主成分分析 (PCA) 与额外树分类器

R语言plotly可视化:使用PCA算法进行数据降维使用plotly可视化PCA所有的主成分绘制散点图矩阵降维后的两个(三个)核心主成分的二维三维可视化图形方差解释的量载荷图等

PCA分析:在dim desc()中得到错误:不方便数据。

我应该如何解释 pca.components_ 的输出

机器学习Sklearn库主成分分析PCA降维的运用实战

PCA whitening