在 PCA 中保留特定组件

Posted

技术标签:

【中文标题】在 PCA 中保留特定组件【英文标题】:Retain specific component in PCA 【发布时间】:2015-09-06 18:27:39 【问题描述】:

我有一个名为“data”的 numpy 数组,它有 500 行和 500 列。使用 sklearn 中的 PCA,我可以将其压缩为 500 行和 15 列。我相信本质上我是从 500 轴和 500 点到 15 轴和 500 点。轴都是正交的,很好地解释了我的数据。

但我想知道是否有办法确保 15 轴之一(我在运行 PCA 后得到)也是原始 500 轴之一。也就是说,我可以保留原始轴之一并使用 PCA(或其他方法)找到剩余的 14 个?

我的代码如下:

from sklearn.decomposition import PCA
#data is some 500x500 numpy array
pca = PCA(n_components = 15)
pca_result = pca.fit_transform(data)
#pca_result is a 500x15 numpy array

【问题讨论】:

【参考方案1】:

您可以简单地从数据中删除要保留的轴:

mask = np.ones(data.shape[1], dtype=np.bool)
mask[special_axis] = False
data_new = data[:, mask]

pca_transformed = PCA(n_components=14).fit_transform(data_new)

这与移除沿此特征的投影相同。 然后,您可以根据需要将原始轴与 PCA 结果叠加:

stacked_result = np.hstack([pca_transformed, data[:, [special_axis]]])

【讨论】:

我虽然想到了这一点,但生成的 14 个维度/轴不会与原始维度正交。然后问题与 14 维的 PCA 相同,并以随机方式任意添加 1 个轴。我错了吗? 它们是正交的。所有 PCA 轴都将位于数据的其余 499 个维度中。此子空间与您遗漏的特征的 1d 子空间正交。 但是我可以将剩余的 499 个数据点投影到我遗漏的轴上吗?以您建议的方式 special_axes 不是 PCA 的一部分,这意味着 499 个点不能投影在该轴上。我基本上想找到与特殊轴“正交”的所有点,以及与该轴最“相似”的点。【参考方案2】:

我认为您要做的是首先对要保留的轴进行线性最小二乘拟合:

axis_to_keep = data[:,column_number][:,np.newaxis]
# next line solves axis_to_keep*x = data
x = np.linalg.lstsq(axis_to_keep,data)[0]

然后从data 中减去使用该模型生成的拟合:

data_2 = data - np.dot(axis_to_keep,x)

此时您可以使用 14 个组件在 data_2 上进行 PCA。您的强制轴(几乎可以肯定)不会与其他轴正交。

【讨论】:

我希望有一些正交的东西。我能想到的使其正交的唯一方法是将 500x500 数据集(它是一个相关表)的行和列实际加倍。这样,特定的行/列就更重要了,你得到的结果最终是正交的,而且通常不包括行/列作为轴。 为什么要对轴进行拟合?方向只是坐标之一。 是的,但我想找到两件事:1) 其余 499 个数据点中的哪一个与我选择的轴最相似。 2) 我想找出 499 个数据点中的哪一个与我选择的轴/点“独立”。我说轴/点是因为它是一个相关矩阵,所以我选择的轴也是一个点。 相似和独立是什么意思?你要求正交,所以我给你正交 ;) 因此,例如,相似点将是同一轴上的点。独立的将是不同轴上的。

以上是关于在 PCA 中保留特定组件的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 PCA 和 NMF 的预测能力

PCA与LLE

DCOM 组件不会保留凭据

9主成分分析

9主成分分析

十一.PCA案例分析及小结