我正在使用 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 向量,定义了我将所有点投影到的新基础。使用 Robust PCA,我得到矩阵 L+S=X。然后运行 pca.fit(L) 吗?我原以为 RPCA 会返回特征向量,但在构建协方差矩阵或执行 SVD 时有内部步骤来排除异常值。
也许我认为的“稳健 PCA”不是其他人使用/编码它的方式?
最佳答案
robust-pca
code将数据矩阵 D
分解为两个矩阵,L
和 S
,它们是“低秩”和“稀疏”矩阵(参见 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/