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

标签 python pca

我正在使用 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 个 3-D 点。我通过 PCA 运行它:

pca=sklean.decompose.PCA(n_components=3)
pca.fit(X)
comps=pca.components_

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

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

最佳答案

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

关于python - 如何使用 Robust PCA 输出作为传统 PCA 的主成分(特征)向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40721260/

相关文章:

javascript - 如何使用Python映射数组

python - 对于从文件对话框加载图像有什么建议吗?

python - 如何使用服务主体和 Python SDK 向 Azure 进行身份验证?

r - 在 R 中进行主成分分析时,如何判断是否首先标准化数据矩阵更好?

机器学习的R和PCA解释

python - 对于 kmeans 散点图,PCA 输出看起来很奇怪

python - 从 Python 生成图形的最简单方法?

r - 有没有办法为数据表绘制 UMAP 或 t-SNE 图?

machine-learning - Scikit-learn PCA .fit_transform 形状不一致(n_samples << m_attributes)

python - python中的递归最小二乘法?