matlab中的PCA选择前n个组件

PCA in matlab selecting top n components

我想 select 矩阵中的顶部 N=10,000 主成分。 pca完成后,MATLAB应该return一个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 return 是维数较低的矩阵。它 应该 return 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);

PCA 是一种降维算法,因此它试图将特征的数量减少为主成分 (PC),每个主成分代表总特征的某种线性组合。所有这些都是为了减少特征 space 的维度,即将大特征 space 转换为更易于管理但仍保留大部分(如果不是全部)信息的特征。

现在针对您的问题,您正在尝试使用 153600 个特征来解释 400 个观测值之间的方差,但是,我们不需要那么多信息 399 个 PC 将解释您样本中 100% 的方差(我会如果不是这种情况,请感到非常惊讶)。其原因基本上是过度拟合,您的算法发现了可以解释样本中每个观察结果的噪声。

所以 rayryeng 告诉你的是正确的,如果你想将你的特征 space 减少到 10,000 个 PC,你将需要 100,000 个观察来让 PC 有意义(这是经验法则,但比较稳定)。

而 matlab 为您提供 399 个 PC 的原因是它能够正确提取 399 个线性组合,这些组合解释了样本中 #% 的方差。

另一方面,如果您所追求的是最相关的特征,那么您不是在寻找降维流程,而是在寻找特征消除过程。这些将只保留最相关的特征,同时取消不相关的特征。

所以澄清一下,如果你的特征 space 是垃圾并且那里没有任何信息只是噪音,解释的方差将是无关紧要的并且确实会小于 100% 例如见正在关注

data = rand(400,401);
[coefs,scores,variances] = pca(data);
numel(variances) 
disp('Var explained ' num2str(cumsum(variances)) '%'])

同样,如果您想减少特征 space,即使使用较小的 m,也有多种方法可以做到这一点,但 PCA 不是其中之一。

祝你好运

前言

我认为您正在成为 XY problem 的牺牲品,因为试图在您的数据中找到 153.600 维是完全非物理的,请询问问题 (X) 而不是您提出的解决方案 (Y)以获得有意义的答案。我将使用此 post 来告诉您为什么 PCA 适合这种情况。我不能告诉你什么能解决你的问题,因为你还没有告诉我们那是什么。

这是一个数学上不合理的问题,我将在此处尝试解释。

PCA

正如user3149915所说,PCA是一种降维的方法。这意味着在你的问题中的某个地方,你有一百五十三千六百个维度在周围浮动。好多啊。很多。解释所有这些存在的物理原因可能比试图解决数学问题更困难。

尝试将那么多维度拟合到仅 400 个观测值是行不通的,因为即使所有观测值都是特征中的线性独立向量 space,您仍然只能提取 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,只要您不告诉我们您的问题是什么,我们就无法帮助您解决问题。

Matlab 尽量不浪费太多资源来计算它。 但是你仍然可以做你想做的,只需使用:

pca(train_data,'Economy','off')