首页 文章

matlab中的PCA选择前n个组件

提问于
浏览
7

我想从矩阵中选择顶部的 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);

I don't understand why MATLAB returns a lesser dimensional matrix. It should return an error with pca: 1536001536008 bytes=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);

3 回答

  • 13

    前言

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

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

    PCA

    正如user3149915所说,PCA是一种减少尺寸的方法 . 这意味着在你的问题的某个地方,你有四十五万三千六百个维度 . 好多啊 . 很多 . 解释所有这些存在的物理原因可能比试图解决数学问题更大的问题 .

    试图将这么多维度拟合到只有400个观测值是行不通的,因为即使所有观测值都是特征空间中的线性独立向量,你仍然只能提取399个维度,因为没有观测值就无法找到其余维度 . 您最多可以通过N个点适合N-1个唯一尺寸,其他尺寸具有无限多个位置可能性 . 就像试图通过两个点拟合平面一样:有一条线可以穿过它们,第三个维度将垂直于该线,但在旋转方向上未定义 . 因此,你会留下无数个可能适合这两点的飞机 .

    我不认为你试图在前400个组件之后适合"noise",我认为你在那之后就适合了 . 您使用了所有数据来获取尺寸,无法创建更多尺寸 . 不可能 . 您所能做的就是获得更多的观察,大约1.5M,并再次进行PCA .

    比维度更多的观察

    为什么需要比维度更多的观察?你可能会问 . 简单,你不能通过一个点,一个独特的平面通过两个点,也不能通过400点独特的153.600维超平面 .
    那么,如果我得到153.600观察,我就设定了?
    可悲的是没有 . 如果你有两个点,并通过它适合你,你会得到100%的合适 . 没错,周杰伦!做完这一天,让我们回家看电视吧!可悲的是,你的老板会在第二天早上打电话给你,因为你的 Health 是垃圾 . 为什么?好吧,如果你有20个点散布在周围,那么拟合不会没有错误,但至少更接近于代表你的实际数据,因为前两个可能是异常值,请看这个非常具有说明性的数字,其中红点这将是你的前两个观察结果:

    enter image description here

    如果你要提取第一个10.000组件,那就是399个精确拟合和9601个零维度 . 甚至可能不会尝试计算超出第399个维度,并将其粘贴到具有10,000个条目的零数组中 .

    TL;DR 您不能使用PCA,只要您不告诉我们您的问题,我们就无法帮助您解决问题 .

  • 0

    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)) '%'])
    

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

    祝好运

  • 6

    Matlab试图不浪费太多资源来计算它 . 但你仍然可以做你想做的事,只需使用:

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

相关问题