2016-04-14 54 views
0

我有一个高维词 - 双克频率矩阵(1100 x 100658,dtype = int)。作为列名,我使用行索引作为行索引来设置word-bi-grams(如'','和',...),其中包含 myPandaDataFrame.columns = word-bi-grams 例如熟练度(高,中,低) myPandaDataFrame.columns.set_index([ 'PROFICIENCY'],就地=真,降=真)Sklearn和PCA。为什么是max n_row == max n_components?

然后我做

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非常陌生,并尝试过几个例子,但似乎我无法为我的矩阵做出正确的选择。 有人看到我在做什么错误,或者有人可以链接到与我的问题类似的教程/示例。我会很开心:)

与问候

+0

您可能可以在http://datascience.stackexchange.com/获得更多帮助。 – Thanos

+0

谢谢,我会尽力而为。 – user6131832

+0

做了任何答案的帮助? – Stefan

回答

0

你不能比的空间尺寸(级别)的数量更多的组件您的矩阵跨度,这反过来会不会比大最少的行数或列数(或者如果矩阵不是满秩的,则减少)。

见下面的例子:有大小500 x 10000的矩阵,你可以要求1000个元件,并会回来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) 
0

PCA将经验数据协方差矩阵分解成特征值和向量。该矩阵的排名为min(n_lines, n_columns)。在这个数字之后,特征值变为0,所以你的数据完全由到目前为止的组件数量来解释。这些组件数量完美地反映了您的数据。为了降低维度,您需要选择较少的组件。