TruncatedSVD返回不正确的尺寸

时间:2017-03-02 14:31:13

标签: python scikit-learn

我有一个矩阵,我试图使用sklearn中的TruncatedSVD类将其分解为较低的维度。对于构造函数中的n_components参数,我传递500.但是当我检查fit_transform方法返回的数据帧的形状时,列数不等于500.我不确定什么造成这种情况。这是代码 -

# 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)不应该是形状{{1}}。我不知道我在这里做错了什么。

1 个答案:

答案 0 :(得分: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实现中都会看到相同的行为。

修改

原因是(从here被盗):

如果n是点数,p是维数和n≤p,那么非零方差的主成分数量不能超过n(在对原始数据执行PCA时)或n-1(在中心数据上执行PCA时 - 像往常一样)