为什么Sklearn PCA需要比新特征(n_components)更多的样本?

4
当使用Sklearn的PCA算法时,可以像这样操作。
x_orig = np.random.choice([0,1],(4,25),replace = True)
pca = PCA(n_components=15)
pca.fit_transform(x_orig).shape

我得到了输出。
(4, 4)

我希望它是:

(4,15)

我明白为什么会发生这种情况。在sklearn的文档里(链接),它说(假设他们的“==”是赋值运算符):

n_components == min(n_samples, n_features)

但他们为什么要这样做呢?另外,我怎样才能直接将一个形状为[1,25]的输入转换成[1,10](不用堆叠虚拟数组)?
1个回答

6
每个主成分都是数据在数据协方差矩阵的特征向量上的投影。如果样本数n小于特征数,协方差矩阵只有n个非零特征值。因此,只有n个有意义的特征向量/组件。
原则上可能存在比样本更多的组件,但多余的组件将是无用的噪音。
Scikit-learn会引发错误而不是默默地执行“任意操作”。这可以防止用户自食其果。样本数少于特征数可能表示数据存在问题,或者对所涉及方法存在误解。

所以您是说,如果我将虚拟样本(>13)堆叠到原始样本中(为1),以获取组件(例如14),那么其中会包含带有无用噪音的组件? - Lcukerd
@lcukerd 我的意思是,如果scikit-learn实现接受n_components > n_samples,那么你将得到无用的噪音(或者可能是零分量)。 - MB-F
如果你“伪造”额外的数据,你可能会达到相同的效果。具体发生什么取决于你使用什么作为虚拟样本。 - MB-F
有人在Matlab中使用过pca模块吗?我正在将Matlab代码转换为sklearn,并且在这一步骤上遇到了困难。例如,我运行的是[EigenVectors,~,EigenValues] = pca(X),其中X是一个48x45维度的double类型。它返回的特征向量是一个48x45的double类型,而特征值的长度为45。你知道Matlab在做什么吗? - mhooper
@mhooper 没有头绪。最好将这个问题单独提出来,并加上 [matlab] 标签,以便吸引 Matlab 专家的注意。 - MB-F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接