Python 在进行文本聚类时,为什么在K-Means之前使用LSA

Python 在进行文本聚类时,为什么在K-Means之前使用LSA,python,scikit-learn,k-means,svd,lsa,Python,Scikit Learn,K Means,Svd,Lsa,我遵循Scikit的本教程,学习使用K-Means进行文本聚类: 在该示例中,可选地使用LSA(使用SVD)来执行降维 这为什么有用?在TF-IDF矢量器中,已经可以使用“max_features”(最大特征)参数控制尺寸(特征)的数量 我知道LSA(和LDA)也是主题建模技术。集群的区别在于文档属于多个主题,但只属于一个集群。我不明白为什么会在K-Means聚类的上下文中使用LSA 示例代码: from sklearn.feature_extraction.text import Tfidf

我遵循Scikit的本教程,学习使用K-Means进行文本聚类:

在该示例中,可选地使用LSA(使用SVD)来执行降维

这为什么有用?在TF-IDF矢量器中,已经可以使用“max_features”(最大特征)参数控制尺寸(特征)的数量

我知道LSA(和LDA)也是主题建模技术。集群的区别在于文档属于多个主题,但只属于一个集群。我不明白为什么会在K-Means聚类的上下文中使用LSA

示例代码:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans

documents = ["some text", "some other text", "more text"]

tfidf_vectorizer = TfidfVectorizer(max_df=0.5, max_features=10000, min_df=2, stop_words='english', use_idf=True)
X = tfidf_vectorizer.fit_transform(documents)

svd = TruncatedSVD(1000)
normalizer = Normalizer(copy=False)
lsa = make_pipeline(svd, normalizer)
Xnew = lsa.fit_transform(X)

model = KMeans(n_clusters=10, init='k-means++', max_iter=100, n_init=1, verbose=False)
model.fit(Xnew)
有证据表明,PCA特征向量是K-均值的良好初始值


使用
max_features
参数控制维度相当于切断词汇表大小,这会产生负面影响。例如,如果将
max_features
设置为10,则模型将处理语料库中最常见的10个单词,而忽略其余的单词。

LSA
将单词袋特征空间转换为新的特征空间(具有正交标准基向量集),其中每个维度代表一个潜在概念(表示为原始维度中单词的线性组合)

PCA
一样,一些顶部特征向量通常捕获变换特征空间中的大部分方差,而其他特征向量主要表示数据集中的噪声,因此,可以认为LSA特征空间中的顶部特征向量可能捕获原始spa中的词定义的大多数概念行政长官

因此,transofrmed LSA特征空间中的降维可能比原始
BOW
tf idf
特征空间中的降维有效得多(只需剔除不太频繁/不重要的单词),从而在降维后产生更高质量的数据,并可能提高聚类的质量


此外,降维有助于对抗维数灾难问题(例如,在k-均值中计算距离时出现的问题)。

谢谢@elyase,这很有帮助。因此,与在TFIDF中简单使用max_features=10相比,使用LSA(SVD)将产生更好的聚类。是LSA(SVD)类似于PCA或者我应该如何看待这一点?LSA和PCA之间的关系是什么?我想你可以在这里找到答案。当你进行降维时会有点不同。PCA计算输入数组的协方差矩阵。对于SVD(或LSA),它使用scipy来立即计算分解矩阵(X=U*s*V.T)。对于scikit学习,您不能将稀疏矩阵馈送到PCA模型,因此如果您有tf idf矩阵,则使用SVD可能是更好的选择。