2016-04-14 52 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,所以你的數據完全由到目前爲止的組件數量來解釋。這些組件數量完美地反映了您的數據。爲了降低維度,您需要選擇較少的組件。