2017-03-02 135 views
0

我有一個矩陣,我試圖使用sklearn中的TruncatedSVD類來降低維數。對於構造函數中的n_components參數,我傳遞了500.但是,當我檢查由fit_transform方法返回的數據幀的形狀時,列數不等於500.我不確定是什麼導致了這種情況。這裏的代碼 -TruncatedSVD返回不正確的尺寸

# ORIGINAL DATAFRAME 
tfidf_df.shape #(277, 51023) 

# INITIALIZE SVD DECOMPOSER 
svd_decomposer = TruncatedSVD(n_components=500, # Desired dimensionality of output data 
algorithm='randomized', # SVD solver to use 
n_iter=5, # Number of iterations for randomized SVD solver 
random_state=42, # pseudo-random number generator 
tol=0.0 # Tolerance for ARPACK 
) 
svd_decomposer.n_components #500 

# DECOMPOSE THE DATAFRAME 
tfidf_svd = svd_decomposer.fit_transform(tfidf_df) 
tfidf_svd.shape # (277, 277) 

不應在輸出數據幀tfidf_svd是形狀(277, 500)的。我不知道我在這裏做錯了什麼。

回答

2

這似乎是預期的行爲。該TruncatedSVD函數調用randomized_svd功能,這裏面有下面的代碼:

if transpose == 'auto': 
    transpose = n_samples < n_features 
if transpose: 
    # this implementation is a bit faster with smaller shape[1] 
    M = M.T 

所以,你將能夠返回組件的最大數量是你的樣本數量。我不記得確切的原因,但我敢肯定有一個線性代數解釋,爲什麼你只限於你保存的樣本數量。在scikit的兩種SVD實現中您都會看到相同的行爲。

EDIT

之所以被(從here被盜):

如果n是點的數量和p是維度n≤p數,然後與非主要部件的數量零差異不能超過n(在做原始數據時做PCA時)或n-1(當像往常一樣對中心數據進行PCA時)