在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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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