2015-06-21 25 views
3

我有一个叫做“data”的numpy数组,它有500行和500列。使用sklearn的PCA我可以将它压缩到500行和15列。我相信实质上我从500轴和500点到15轴和500点。这些轴都是正交的,并很好地解释了我的数据。保留PCA中的特定组件

但是我想知道是否有确保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 

回答

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

我虽然这样,但由此产生的14个尺寸/轴不会与原来的正交。然后问题与14维的PCA相同,并以随机方式任意添加1个轴。我错了吗? –

+0

它们是正交的。所有PCA轴将位于数据的剩余499维中。该子空间与您遗漏的特征的1d子空间正交。 –

+0

但是我可以将剩下的499个数据点投影到我遗漏的坐标轴上吗?用你建议的方式,special_axes不是PCA的一部分,这意味着499分不能被投影在该轴上。我基本上想要找到与特殊轴“正交”的所有点,以及与该轴最“相似”的那些点。 –

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) 

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

+0

我曾希望有一些正交的东西。我能想到的使其正交的唯一方法是将500x500数据集的行和列实际加倍(它是一个相关表)。这样,特定的行/列更重要,并且您得到的结果是正交的,而且更多 - 往往不包括行/列作为轴。 –

+0

你为什么要做一个适合的轴?方向只是其中一个坐标。 –

+0

是的,但我想找到2件事:1)其余499个数据点中哪一个与我选择的轴最为相似。 2)我想要找出499个数据点中的哪一个与我选择的轴/点“独立”。我说axis/point,因为它是一个相关矩阵,我选择的轴也是一个点。 –