tf idf上截断的svd给出的值错误数组太大了

时间:2013-11-26 12:11:29

标签: scipy scikit-learn scikits

我正在尝试在scikit-learn中由TfidfVectorizer给出的稀疏矩阵上应用TruncatedSVD.fit_transform(),它给出了:

    tsv = TruncatedSVD(n_components=10000,algorithm='randomized',n_iterations=5)
    tfv = TfidfVectorizer(min_df=3,max_features=None,strip_accents='unicode',analyzer='word',token_pattern=r'\w{1,}',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1)
    tfv.fit(text)
    text = tfv.transform(text)
    tsv.fit(text)

Value error : array is too big

我可以使用的其他方法或减少维数。

2 个答案:

答案 0 :(得分:3)

我很确定问题是:

tsv = TruncatedSVD(n_components=10000...

您的SVD中有10000个组件。如果您有一个m×n数据矩阵,SVD将具有维度为m x n_components和n_components x n的矩阵,即使数据稀疏,这些矩阵也会很密集。那些矩阵可能太大了。

我复制了你的代码并在Kaggle Hashtag数据上运行它(我认为这是来自),在300个组件中,python使用高达1GB。在10000,你使用大约30倍。

顺便说一下,你在这里做的是潜在的语义分析,并且不太可能从这么多组件中受益。在50-300范围内的某个地方应该捕捉重要的一切。

答案 1 :(得分:0)

当您使用32位python时,可能会出现此错误。尝试切换到64位。稀疏矩阵降维的另一种方法是使用RandomizedPCA,这是使用随机SVD的PCA。