我有大约1000个维度为50000的向量x_i,但它们非常稀疏;每个向量只有大约50-100个非零元素。我想在MATLAB中对这个数据集进行PCA,以减少数据的极端维度。
不幸的是,由于需要从所有样本中减去均值,我不知道有什么方法可以不通过中间完整矩阵来实现这一点。当然,一个1000×50000的矩阵太大,无法装入内存(实际上,当我尝试时,它会使我的整个电脑崩溃)。MATLAB内置的princomp
函数在我尝试使用时也会使我的电脑崩溃。
所以我的问题是:有没有一种方法可以在不生成一个巨大的非稀疏矩阵作为中间步骤的情况下,对这些数据进行PCA?
回答:
你不需要形成完整的数据矩阵来减去均值,或者计算协方差矩阵。只需迭代地计算1000×1000的协方差矩阵(遍历数据向量)。一旦你形成了协方差矩阵,你可以通过中心化协方差矩阵来隐式地减去均值。请参阅这篇关于核PCA的论文末尾的部分,解释如何中心化一个核矩阵。只要将核矩阵基本视为与协方差矩阵相同即可。