matlab - matlab中的PCA选择前n个组件

标签 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

应该是 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 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);

最佳答案

前言

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

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

主成分分析

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

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

在前 400 个组件之后,就没有剩余的维度了。在那之后你正在适应一个空洞。您使用了所有数据来获取维度,无法创建更多维度。不可能的。您所能做的就是获得更多的观察结果,大约 1.5M,然后再次进行 PCA。

观察值多于维度

为什么您需要比维度更多的观测值?你可能会问。很简单,您不能通过一个点拟合一条唯一的线,也不能通过两个点拟合一个唯一的平面,也不能通过 400 个点拟合一个唯一的 153.600 维超平面。

那么,如果我得到 153.600 个观察值,我就确定了吗?

很遗憾,没有。如果你有两个点并通过它拟合一条线,你将得到 100% 的拟合。没有错误,杰伊!今天结束了,我们回家看电视吧!可悲的是,你的老板会在第二天早上调用你,因为你的健康状况很糟糕。为什么?好吧,如果你有例如 20 个点分散在周围,那么拟合不会没有错误,但至少更接近于代表你的实际数据,因为前两个可能是异常值,请看这个非常说明性的数字,其中红色点将是您的前两个观察结果:

enter image description here

如果您要提取前 10.000 个组件,则将有 399 个精确拟合和 9601 个零维度。最好甚至不尝试计算超出第 399 个维度,并将其粘贴到具有 10.000 个条目的零数组中。

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

关于matlab - matlab中的PCA选择前n个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140297/

相关文章:

python - python中PCA的内存错误

matlab - 在 MEX 文件中填充 plhs[] 的正确方法是什么?

c++ - 使用 MATLAB 创建 C 共享库以在 VS2010 中使用时出错

r - 使用自动绘图显示非默认主成分 (ggfortify)

r - 使用循环神经网络格式化时间序列数据以进行短期预测

scala - 如何使用以 LibSVM 格式训练的 Spark MLlib 模型进行预测

python - 在 Python 中实现 PCA(基于特征向量)

matlab - 创建两个不同随机整数的优雅方式

math - 模运算的时间复杂度

machine-learning - 如何创建可以使用Matlab中的load datasetname命令加载的数据集?