在MATLAB中选择前n个主成分

我想从一个矩阵中选择前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字节=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问题,因为试图在你的数据中寻找153,600个维度完全是不合理的,请询问问题(X)而不是你提出的解决方案(Y),以获得有意义的回答。我将仅使用此帖子来告诉你为什么在这种情况下PCA并不合适。我无法告诉你什么能解决你的问题,因为你还没有告诉我们那是什么问题。

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

PCA

正如用户3149915所说,PCA是一种降维的方法。这意味着在你的问题中,你有十五万三千六百个维度在流动。这很多。非常多。解释所有这些维度存在的物理原因可能比试图解决数学问题更困难。

试图将这么多维度拟合到只有400个观测值上是行不通的,因为即使所有观测值在你的特征空间中都是线性独立的向量,你也只能提取399个维度,因为剩下的维度根本找不到,因为没有足够的观测值。你最多只能通过N个点拟合N-1个独特的维度,其他的维度有无限的可能位置。就像试图通过两个点拟合一个平面:你可以通过这两个点拟合一条线,第三个维度将与那条线垂直,但旋转方向上是未定义的。因此,你剩下的将是通过这两个点拟合的无限可能的平面。

在前400个成分之后,就没有更多的维度了。此后你是在拟合一个虚空。你用完所有的数据来获取维度,并且无法创建更多的维度。不可能。你能做的就是获取更多的观测值,大约150万,然后重新进行PCA。

观测值多于维度

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

那么,如果我有153,600个观测值,我就成功了吗?

很遗憾,不是。如果你有两个点并通过它们拟合一条线,你会得到100%的拟合。没有错误,太棒了!今天的工作完成了,我们回家看电视吧!很遗憾,你的老板第二天早上会打电话给你,因为你的拟合是垃圾。为什么呢?好吧,如果你有20个点散布在周围,拟合不会没有错误,但至少更接近于代表你的实际数据,因为前两个点可能是异常值,请看这个非常说明问题的图,其中红色点将是你的前两个观测值:

enter image description here

如果你要提取前10,000个成分,那将是399个精确拟合和9601个零维度。还不如不尝试计算超过第399个维度,直接将其放入一个有10,000个条目的零数组中。

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注