matlab中的PCA选择前n个组件

Abh*_*tia 7 matlab machine-learning pca

我想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
Run Code Online (Sandbox Code Playgroud)

应该是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);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么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);
Run Code Online (Sandbox Code Playgroud)

Adr*_*aan 14

前言

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

这是一个数学上不健全的问题,我将在这里解释一下.

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,只要您不告诉我们您的问题是什么,我们就无法帮助您解决问题.


eya*_*req 6

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

现在针对您的问题,您尝试使用153600功能解释400个观测值的差异,但是,我们不需要那么多信息399 PC将解释您样本中100%的差异(如果这样,我会非常惊讶事实并非如此).其原因基本上是过度拟合,您的算法会发现噪声来解释样本中的每个观察结果.

因此,rayryeng告诉你的是正确的,如果你想将你的特征空间减少到10,000个PC,那么你将需要100,000个PC的观察值来表示任何东西(这是一个经验法则,但是相当稳定).

而matlab给你399台PC的原因是因为它能够正确地提取399个线性组合,这些组合解释了样本中方差的一些#%.

另一方面,如果你所追求的是最相关的特征,而不是你没有寻找尺寸减小流程,而是特征消除过程.这些将仅保留最相关的功能,同时使无关的功能归零.

所以只是要明确一点,如果你的特征空间是垃圾并且没有任何信息只有噪音,所解释的差异将是无关紧要的,并且确实会低于100%,例如请参阅以下内容

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

再次,如果你想减少你的特征空间,即使有一个小的m,也有办法,但PCA不是其中之一.

祝好运