Kmean 聚类聚类中的顶级术语

Nhq*_*azi 4 python cluster-analysis k-means scikit-learn

我正在使用 python Kmean 聚类算法来聚类文档。我创建了一个术语文档矩阵

   from sklearn.feature_extraction.text import TfidfVectorizer
   from sklearn.cluster import KMeans
   vectorizer = TfidfVectorizer(tokenizer=tokenize, encoding='latin-1',
                          stop_words='english')
    X = vectorizer.fit_transform(token_dict.values())
Run Code Online (Sandbox Code Playgroud)

然后我使用以下代码应用 Kmean 聚类

 km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
 y=km.fit(X)
Run Code Online (Sandbox Code Playgroud)

我的下一个任务是查看每个集群中的顶级术语,在 googole 上搜索建议许多人使用 km.cluster_centers_.argsort()[:, ::-1] 来使用以下命令查找集群中的顶级术语以下代码:

 print("Top terms per cluster:")
 order_centroids = km.cluster_centers_.argsort()[:, ::-1]
 terms = vectorizer.get_feature_names()
 for i in range(true_k):
     print("Cluster %d:" % i, end='')
     for ind in order_centroids[i, :10]:
         print(' %s' % terms[ind], end='')
         print()
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,据我了解, km.cluster_centers_ 返回簇中心的坐标,例如,如果有 100 个特征和三个簇,它将返回一个 3 行和 100 列的矩阵,表示每个簇的质心。我希望了解上面的代码中如何使用它来确定集群中的顶级术语。感谢任何评论 Nadeem

scn*_*erd 6

您对聚类中心的形状和含义的理解是正确的。因为您使用的是 Tf-Idf 向量化器,所以您的“特征”是给定文档中的单词(每个文档都是其自己的向量)。因此,当您对文档向量进行聚类时,质心的每个“特征”代表该单词与其的相关性。“word”(在词汇中)=“feature”(在向量空间中)=“column”(在质心矩阵中)

get_feature_names调用获取列索引到它所代表的单词的映射(从文档看来......如果这不能按预期工作,只需反转矩阵vocabulary_即可获得相同的结果)。

然后,该.argsort()[:, ::-1]行将每个质心转换为其中最“相关”(高值)的列的排序(降序)列表,因此也是最相关的单词(因为单词=列)。

其余的代码只是打印,我确信不需要任何解释。所有代码真正要做的就是按其中最有价值的特征/单词的降序对每个质心进行排序,然后将这些列映射回其原始单词并打印它们。