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