我想从一个矩阵中选择前N=10,000
个主成分。完成PCA后,MATLAB应该返回一个pxp
矩阵,但它没有!
>> size(train_data)ans = 400 153600>> [coefs,scores,variances] = pca(train_data);>> size(coefs)ans = 153600 399>> size(scores)ans = 400 399>> size(variances)ans = 399 1
它应该是coefs:153600 x 153600
?以及scores:400 X 153600
?
当我使用下面的代码时,它会给我一个内存不足错误:
>> [V D] = eig(cov(train_data));Out of memory. Type HELP MEMORY for your options.Error in cov (line 96) xy = (xc' * xc) / (m-1);
我不明白为什么MATLAB返回一个维度较低的矩阵。它应该在PCA时返回一个错误:153600*153600*8字节=188 GB
eigs的错误:
>> eigs(cov(train_data));Out of memory. Type HELP MEMORY for your options.Error in cov (line 96) xy = (xc' * xc) / (m-1);
回答:
前言
我认为你陷入了XY问题,因为试图在你的数据中寻找153,600个维度完全是不合理的,请询问问题(X)而不是你提出的解决方案(Y),以获得有意义的回答。我将仅使用此帖子来告诉你为什么在这种情况下PCA并不合适。我无法告诉你什么能解决你的问题,因为你还没有告诉我们那是什么问题。
这是一个数学上不合理的问题,我将在这里尝试解释原因。
PCA
正如用户3149915所说,PCA是一种降维的方法。这意味着在你的问题中,你有十五万三千六百个维度在流动。这很多。非常多。解释所有这些维度存在的物理原因可能比试图解决数学问题更困难。
试图将这么多维度拟合到只有400个观测值上是行不通的,因为即使所有观测值在你的特征空间中都是线性独立的向量,你也只能提取399个维度,因为剩下的维度根本找不到,因为没有足够的观测值。你最多只能通过N个点拟合N-1个独特的维度,其他的维度有无限的可能位置。就像试图通过两个点拟合一个平面:你可以通过这两个点拟合一条线,第三个维度将与那条线垂直,但旋转方向上是未定义的。因此,你剩下的将是通过这两个点拟合的无限可能的平面。
在前400个成分之后,就没有更多的维度了。此后你是在拟合一个虚空。你用完所有的数据来获取维度,并且无法创建更多的维度。不可能。你能做的就是获取更多的观测值,大约150万,然后重新进行PCA。
观测值多于维度
你可能会问,为什么需要更多的观测值而不是维度?很简单,你不能通过一个点拟合一条独特的线,也不能通过两个点拟合一个独特的平面,也不能通过400个点拟合一个153,600维的超平面。
那么,如果我有153,600个观测值,我就成功了吗?
很遗憾,不是。如果你有两个点并通过它们拟合一条线,你会得到100%的拟合。没有错误,太棒了!今天的工作完成了,我们回家看电视吧!很遗憾,你的老板第二天早上会打电话给你,因为你的拟合是垃圾。为什么呢?好吧,如果你有20个点散布在周围,拟合不会没有错误,但至少更接近于代表你的实际数据,因为前两个点可能是异常值,请看这个非常说明问题的图,其中红色点将是你的前两个观测值:
如果你要提取前10,000个成分,那将是399个精确拟合和9601个零维度。还不如不尝试计算超过第399个维度,直接将其放入一个有10,000个条目的零数组中。
TL;DR 你不能使用PCA,只要你不告诉我们你的问题是什么,我们就无法帮助你解决问题。