我有一个矩阵,我试图使用 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)
。我不知道我在这里做错了什么。
最佳答案
这似乎是预期的行为。 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时 - 像往常一样)
关于python - TruncatedSVD 返回不正确的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42558153/