我正在使用PCA来减少N维数据集的维数,但是我想对较大的离群值建立鲁棒性,因此我一直在研究稳健的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_
Run Code Online (Sandbox Code Playgroud)
这3个分量是3D矢量,它们定义了我将所有点投影到的新基础。使用健壮的PCA,我得到的矩阵L + S = X。然后执行pca.fit(L)吗?我本以为RPCA会给我本征向量,但是在建立协方差矩阵或执行SVD的过程中,有内部步骤可以剔除异常值。
也许我认为“健壮的PCA”不是别人使用/编码的方式吗?
的robust-pca
代码因子数据矩阵D
成两个矩阵,L
并且S
其是“低秩”和“疏”矩阵(见本文的详细信息)。 L
在各种观察之间,大多数情况下是恒定的,而S
在变化之间是什么。图2和图3中的纸张从一对夫妇的安全摄像机提供一个非常好的例子,挑选出静态背景(L
)和variabity如过客人(S
)。
如果只需要特征向量,则将其S
视为垃圾(要裁剪的“大异常值”),然后对L
矩阵进行特征分析。
这是使用robust-pca
代码的示例:
L, S = RPCA(data).fit()
rcomp, revals, revecs = pca(L)
print("Normalised robust eigenvalues: %s" % (revals/np.sum(revals),))
Run Code Online (Sandbox Code Playgroud)
这里的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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3321 次 |
最近记录: |