Sklearn 和 PCA。为什么 max n_row == max n_components?

数据挖掘 Python scikit-学习 熊猫 主成分分析
2022-02-24 18:54:31

我在堆栈溢出上发布了我的问题,但有人建议我应该在这里尝试。我现在在做什么:)

OK,先来我的资料。我有一个 word-bi-gram 频率矩阵(1100 x 100658,dtype=int),其中前 5 列包含有关文档的信息。所以每一行都是一个文档,每一列都是一个单词-bi-gram,比如(of-the,on-the,and-that,...)。我想可视化数据,但在此之前,我想减少维度。所以我想我用 sklearn 的 PCA 来做到这一点。首先我设置列标签

myPandaDataFrame.columns = word-bi-grams

然后我删除了一些doc-columns,因为我想看看如果只看熟练度,我能得到什么样的信息。

del existing_df['SUBSET']
del existing_df['PROMPT']
del existing_df['L1']
del existing_df['ESSAYID']

然后我将熟练度列设置为索引

myPandaDataFrame.columns.set_index(['PROFICIENCY'], inplace=True, drop=True)

然后我做了这个

from sklearn.decomposition import PCA
x = 500
pcax = PCA(n_components=x)
pcax.fit(myPandaDataFrame)
PCA(copy=True, n_components=x, whiten=False)
existing_2dx = pcax.transform(myPandaDataFrame)
existing_df_2dx = pandas.DataFrame(existing_2dx)
existing_df_2dx.index = myPandaDataFrame.index
existing_df_2dx.columns = ['PC{0}'.format(i) for i in range(x)]

但是通过这个实现,我最多只能设置 1100 个 n_components。这是文档(行)的数量。这让我很怀疑。我尝试了几个示例/教程,但我做错了。所以我希望有人可以帮助我找出我做错了什么?如果有一个很好的例子/教程可以帮助我解决我的问题,我也会很高兴。谢谢你。

最诚挚的问候。

1个回答

给定 m 行 n 列,我认为将数据视为 n 维是很自然的。然而,数据的固有维度 d 可能会更低;d <= n。d 是您可以从数据中形成的 mxn 矩阵的秩。甚至可以在不丢失信息的情况下将数据的维数减少到 d。行实际上也是如此,虽然不太直观,但确实如此;d <= 米。因此,将维度降低到 <= d 总是有意义的,因为没有损失;我们通常会进一步减少。这就是为什么它不会让您减少到超过行数的原因。