如何使用稳健的 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
分解为两个矩阵,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://***.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 的主成分(特征)向量的主要内容,如果未能解决你的问题,请参考以下文章
R语言plotly可视化:使用PCA算法进行数据降维使用plotly可视化PCA所有的主成分绘制散点图矩阵降维后的两个(三个)核心主成分的二维三维可视化图形方差解释的量载荷图等