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

时间:2016-04-14 12:37:37

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

我有一个高维词 - 二元频率矩阵(1100 x 100658,dtype = int)。作为列名,我正在设置word-bi-gram(比如'of-the','和-the',...) myPandaDataFrame.columns = word-bi-gram 作为行索引我用例如熟练程度(高,中,低) 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个组件。这是现有行的数量。我对PCA很新,并尝试了几个例子,但似乎我无法将其用于我的矩阵。 有人看到我在做错的地方,或者有人链接到与我的问题类似的教程/示例。我会很高兴:)。

最诚挚的问候

2 个答案:

答案 0 :(得分:0)

您的矩阵跨越空间的维度(等级)的数量不能超过行数或列数的最小值(或者如果矩阵的数量更少)不完全排名)。

请参阅下面的示例:使用大小为500 x 10000的矩阵,您可以要求1,000个组件并返回500,然后您可以在其上投影矩阵,返回500 x 500矩阵:< / p>

df = pd.DataFrame(data=np.random.random(size=(500, 10000)))

RangeIndex: 500 entries, 0 to 499
Columns: 10000 entries, 0 to 9999
dtypes: float64(10000)
memory usage: 38.1 MB

x = 1000
pca = PCA(n_components=x)
pca.fit(df)
pca.explained_variance_ratio_.shape

(500,)

existing_2dx = pca.transform(df)
existing_2dx.shape

(500, 500)

答案 1 :(得分:0)

PCA将经验数据协方差矩阵分解为特征值和向量。该矩阵的等级为min(n_lines, n_columns)。在此数字之后,特征值变为0,因此您的数据完全由到那里的组件数量来解释。这些组件可以完美地反映您的数据。为了减少任何维数,你需要选择更少的组件。