我想从矩阵中选择顶部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
?
当我使用下面的代码时,它给了我一个Out of Memory错误::
>> [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);
答案 0 :(得分:13)
我认为你正在成为XY problem的牺牲品,因为试图找到数据中的153.600维是完全非物理的,请按顺序询问问题(X)而不是你提出的解决方案(Y)得到一个有意义的答案。我将仅使用这篇文章告诉你为什么PCA 不在这种情况下非常适合。我不能告诉你什么会解决你的问题,因为你没有告诉我们那是什么。
这是一个数学上不合理的问题,我将在这里解释一下。
正如user3149915所说,PCA是一种减少尺寸的方法。这意味着在你的问题的某个地方,你有四十五万三千六百个维度。这很重要。很多。解释所有这些存在的物理原因可能比解决数学问题更重要。
尝试将多个维度拟合到仅400个观察值是行不通的,因为即使所有观察结果都是特征空间中的线性独立向量,您仍然可以仅提取399个维度,因为其余部分因为没有而无法找到观察结果。您最多可以通过N个点适合N-1个唯一尺寸,其他尺寸具有无限多个位置可能性。就像试图通过两个点拟合平面一样:有一条线可以穿过它们,第三个维度将垂直于该线,但在旋转方向上未定义。因此,你会留下无数个可能适合这两点的飞机。
我认为你没有想要适应"噪音"在最初的400个组件之后,我认为你在那之后适应了一个空白。您使用了所有数据来获取维度,无法创建更多维度。不可能。你所能做的只是获得更多的观察,大约1.5M,并再次进行PCA。
为什么需要比尺寸更多的观察?你可能会问。很容易,你不能通过一个点,一个独特的平面穿过两个点,也不能通过400点的独特153.600维超平面。
那么,如果我得到153.600次观察,我会设置吗?可悲的是,没有。如果你有两个点,并通过它适合一条线,你得到100%的合适。没错,周杰伦!做完这一天,让我们回家看电视吧!可悲的是,你的老板会在第二天早上打电话给你,因为你的健康是垃圾。为什么?好吧,如果你有20个点散布在周围,那么拟合不会没有错误,但至少更接近于代表你的实际数据,因为前两个可能是异常值,请看这个非常具有说明性的数字,其中红点将是你的前两个观察结果:
如果您要提取前10,000个组件,那么它将是399个精确拟合和9601个零维度。甚至可能不会尝试计算超出第399个维度,并将其粘贴到具有10,000个条目的零数组中。
TL; DR 您不能使用PCA,只要您不告诉我们您的问题,我们就无法帮助您解决问题。
答案 1 :(得分:6)
PCA是一种降维算法,因此它试图减少主要组件(PC)的特征数量,每个特征代表总特征的一些线性组合。所有这些都是为了减小特征空间的尺寸,即将大特征空间变换为更易于管理但仍保留大部分(如果不是全部)信息的特征空间。
现在针对您的问题,您尝试使用153600功能解释400个观测值的差异,但是,我们不需要那么多信息399 PC会解释您样本中100%的差异(我会非常如果不是这样的话会感到惊讶)。其原因基本上是过度拟合,您的算法会发现噪声来解释样本中的每个观察结果。
所以rayryeng告诉你的是正确的,如果你想将你的特征空间减少到10,000个PC,那么PC需要100,000个观察值来表示任何东西(这是经验法则,但是相当稳定)。 / p>
而matlab给你399个PC的原因是因为它能够正确提取399个线性组合,这些组合解释了样本中一些#%的方差。
另一方面,如果你所追求的是最相关的功能,而不是你没有寻找降维流程,而是功能消除过程。这些将仅保留最相关的功能,同时使无关的功能归零。
所以只是要明确一点,如果你的特征空间是垃圾,并且没有任何信息只有噪音,那么所解释的差异将是无关紧要的,并且确实会低于100%,例如见下文
data = rand(400,401);
[coefs,scores,variances] = pca(data);
numel(variances)
disp('Var explained ' num2str(cumsum(variances)) '%'])
再次,如果你想减少你的特征空间,即使有一个小的m,也有办法,但PCA不是其中之一。
祝你好运
答案 2 :(得分:0)
Matlab试图不浪费太多资源来计算它。 但你仍然可以做你想做的事,只需使用:
idvideo