2017-03-02 98 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时)