为什么 Sklearn PCA 需要比新功能更多的样本(n_components)?
Why Sklearn PCA needs more samples than new features(n_components)?
像这样使用 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](不堆叠虚拟数组)?
每个主成分都是数据在数据协方差矩阵的特征向量上的投影。如果样本 n 少于特征,则协方差矩阵只有 n 非零特征值。因此,只有 n eigenvectors/components 有意义。
原则上可以有比样本更多的成分,但多余的成分将是无用的噪音。
Scikit-learn 会引发错误,而不是默默地做 任何事情。这可以防止用户搬起石头砸自己的脚。样本少于特征可能表示数据有问题,或者对所涉及的方法有误解。
像这样使用 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](不堆叠虚拟数组)?
每个主成分都是数据在数据协方差矩阵的特征向量上的投影。如果样本 n 少于特征,则协方差矩阵只有 n 非零特征值。因此,只有 n eigenvectors/components 有意义。
原则上可以有比样本更多的成分,但多余的成分将是无用的噪音。
Scikit-learn 会引发错误,而不是默默地做 任何事情。这可以防止用户搬起石头砸自己的脚。样本少于特征可能表示数据有问题,或者对所涉及的方法有误解。