【问题标题】:Sklearn and PCA. Why is max n_row == max n_components?Sklearn 和 PCA。为什么 max n_row == max n_components?
【发布时间】:2016-08-06 00:32:24
【问题描述】:

我有一个高维单词-bi-gram 频率矩阵(1100 x 100658,dtype=int)。作为列名,我使用 myPandaDataFrame.columns = word-bi-grams 作为行索引,我使用例如熟练度(高、中、低) 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 很陌生,并尝试了几个例子,但似乎我无法让它适合我的矩阵。 是否有人看到我在哪里做错了,或者有人可以链接到与我的问题类似的教程/示例。我会很高兴:)

致以最诚挚的问候

【问题讨论】:

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


【解决方案1】:

您不能拥有比矩阵跨越的空间的维数(秩)更多的组件,这反过来又不会大于行数或列数的最小值(如果矩阵不是,则小于满级)。

参见下面的示例:对于大小为 500 x 10000 的矩阵,您可以请求 1,000 个组件,将返回 500 个,然后您可以在其上投影您的矩阵,返回一个 500 x 500 矩阵:

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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2018-12-05
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2012-08-26
      • 2017-02-23
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多