【问题标题】:Why Sklearn PCA needs more samples than new features(n_components)?为什么 Sklearn PCA 需要比新特征(n_components)更多的样本?
【发布时间】:2018-12-05 00:13:10
【问题描述】:

当使用像这样的 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](不堆叠虚拟数组)?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以你的意思是,如果我将虚拟样本 (>13) 堆叠到原始样本(1 个)以获取组件(比如 14),那么它将包含具有无用噪声的组件?
    • @lcukerd 我的意思是说,如果 scikit-learn 实现接受n_components > n_samples,你会得到无用的噪音(或者可能是零组件)。
    • 如果你“伪造”额外的数据,你可能会达到同样的效果。究竟会发生什么取决于您将什么用作虚拟样本。
    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多