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

时间:2018-06-26 10:00:21

标签: python python-3.x scikit-learn pca

在使用像这样的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(here)的文档中说(假设它们的'=='是赋值运算符):

n_components == min(n_samples, n_features)

但是他们为什么要这样做? 另外,如何将形状为[1,25]的输入直接转换为[1,10](不堆叠虚拟数组)?

1 个答案:

答案 0 :(得分:4)

每个主分量是数据在数据协方差矩阵的特征向量上的投影。如果样本 n 少于特征,则协方差矩阵仅具有 n 个非零特征值。因此,只有 n 个本征向量/分量才有意义。

原则上,可能有比样本更多的成分,但是多余的成分将是无用的噪声。

Scikit-learn会引发错误,而不是默默地执行 。这样可以防止用户用脚射击自己。样本少于特征的样本可能表明数据有问题,或者对所涉及的方法有误解。