python - TruncatedSVD 返回不正确的尺寸

标签 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)。我不知道我在这里做错了什么。

最佳答案

这似乎是预期的行为。 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/

相关文章:

python - 如何获取特定时间范围的平均值

python - 在 Python 中将 UTF-8 转换为字符串文字

python - django 模板 - 如何动态访问变量?

python - 如何使用 Python 和 Scikit 学习使用一种热编码进行线性回归?

python - 使用 Out of Core 进行 Scikit Learn 多标签分类

Python sklearn 安装窗口

python - 如何在 python 中加入 2 个字典列表?

Python 解析 Minecraft 数据包

python - 如何在Python中创建一个易于解释的具有分类特征的回归模型?

python - 在 Dataframe 中的某些列上输入