Kmean聚类聚类中的***术语
Posted
技术标签:
【中文标题】Kmean聚类聚类中的***术语【英文标题】:Kmean clustering top terms in cluster 【发布时间】:2018-05-07 05:16:55 【问题描述】:我正在对集群文档使用 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())
然后我使用以下代码应用 Kmean 聚类
km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
y=km.fit(X)
我的下一个任务是查看每个集群中的热门词,在 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()
现在我的问题是,据我了解,km.cluster_centers_ 返回集群中心的坐标,例如,如果有 100 个特征和三个集群,它将返回一个 3 行 100 列的矩阵,代表一个质心每个集群。我希望了解如何在上述代码中使用它来确定集群中的***术语。 谢谢任何cmets表示赞赏 纳迪姆
【问题讨论】:
我确定我可以查到,但TfidfVectorizer
和KMeans
来自哪个库?如果您针对该软件包中的专家,您可能会得到更好的回应。具体来说,这些信息可以包含在标签中,也可以包含在问题本身和正文中。
我现在已经提到了我使用的库,它们来自 sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans
【参考方案1】:
游戏有点晚了,但我有同样的问题,但找不到满意的答案。
这就是我所做的:
from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.text import TfidfVectorizer
# documents you are clustering
docs = ['first document', 'second', 'third doc', 'etc.'] * 10
# init vectorizer
tfidf = TfidfVectorizer()
# fit vectorizer and get vecs
vecs = tfidf.fit_transform(docs)
# fit your kmeans cluster to vecs
# don't worry about the hyperparameters
clusters = MiniBatchKMeans(
n_clusters=16,
init_size=1024,
batch_size=2048,
random_state=20
).fit_predict(vecs)
# get dict of keyword id: keyword name
labels = tfidf.get_feature_names()
def get_cluster_keywords(vecs, clusters, docs, labels, top_n=10):
# init a dict where we will count term occurence
cluster_keyword_ids = cluster_id: for cluster_id in set(clusters)
# loop through the vector, cluster and content of each doc
for vec, i, sent in zip(vecs, clusters, docs):
# inspect non zero elements of rows of sparse matrix
for j in vec.nonzero()[1]:
# check we have seen this keword in this cluster before
if j not in cluster_keyword_ids[i]:
cluster_keyword_ids[i][j] = 0
# add a count
cluster_keyword_ids[i][j] += 1
# cluster_keyword_ids contains ids
# we need to map back to keywords
# do this with the labels param
return
cluster_id: [
labels[keyword_id] # map from kw id to keyword
# sort through our keyword_id_counts
# only return the top n per cluster
for keyword_id, count in sorted(
keyword_id_counts.items(),
key=lambda x: x[1], # sort from highest count to lowest
reverse=True
)[:top_n]
] for cluster_id, keyword_id_counts in cluster_keyword_ids.items()
然后就可以运行了:
>>> get_cluster_keywords(vecs, clusters, docs, labels, top_n=10)
0: ['document', 'first'], 1: ['second'], 2: ['doc', 'third'], 3: ['etc']
【讨论】:
【参考方案2】:您对集群中心的形状和含义是正确的。因为您使用的是 Tf-Idf 矢量化器,所以您的“特征”是给定文档中的单词(每个文档都是它自己的向量)。因此,当您对文档向量进行聚类时,质心的每个“特征”都代表了该词与它的相关性。 “word”(在词汇表中)="feature"(在您的向量空间中)="column"(在您的质心矩阵中)
get_feature_names
调用将列索引映射到它所代表的单词(从文档中看来...如果这不能按预期工作,只需反转 vocabulary_
矩阵以获得相同的结果)。
然后.argsort()[:, ::-1]
行将每个质心转换为其中最“相关”(高价值)的列的排序(降序)列表,因此也是最相关的单词(因为 words=columns)。
其余的代码只是打印,我确信不需要任何解释。代码实际上所做的就是按照其中最有价值的特征/单词的降序对每个质心进行排序,然后将这些列映射回它们的原始单词并打印它们。
【讨论】:
Scnerd ,感谢您的解释,但是,我仍然对此感到困惑。我担心的是,一个集群会有“n”个文档,每个文档由一个由“M”个术语组成的特征向量表示。然而,集群的质心将有一个由“M”个特征组成的向量,那么集群中的“n”个文档中的术语呢?上面代码中的顶部术语是通过反转质心提取的。当我们反转它时,质心中存在的术语将突出显示,而不是文档中的所有其他术语........ 在 K-means 中,centroid 是集群中文档的均值,而在 Tf-Idf 中所有值都是非负的,因此集群中每个文档中的每个单词都将表示为它的质心。因此,在质心中重要的术语是那些在该集群中的所有文档中最重要的术语。没有一个字被遗漏,但很多都变得微不足道。文档向量中最高的 Tf-Idf 值是那些对该文档最重要的词;同样,质心中那些价值最高的词是对整个集群最重要的词。这有帮助吗? 顺便说一下,如果您对仅根据其中存在的单词对文档进行聚类感兴趣,您是否考虑过 LDA 和主题建模? 感谢 s 确实是一个很好的解释,澄清了我的困惑。是的,我对 LDA 建模感兴趣,你有任何链接可以在 python 中开始使用它吗? scikit-learn.org/stable/modules/generated/… 和 github.com/bmabey/pyLDAvis 用于可视化,也许?以上是关于Kmean聚类聚类中的***术语的主要内容,如果未能解决你的问题,请参考以下文章
matlab如何求kmean聚类中心点的坐标和各个中心包含的样本点数,要用到那些命令
图像分割基于matlab Kmean聚类分水岭oust粒子群算法优化脂肪肝图像分割含Matlab源码 2277期