保留PCA中的特定组分

时间:2015-06-21 02:29:48

标签: python python-2.7 numpy scikit-learn pca

我有一个名为"数据"的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

2 个答案:

答案 0 :(得分:0)

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

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)

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

答案 1 :(得分:0)

您只需从数据中删除想要保留的轴:

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]]])