如何可视化基于共现矩阵训练的Kmeans词聚类结果?
如何可视化基于共现矩阵训练的Kmeans词聚类结果?
你的PCA降维思路其实完全没问题,这是文本聚类可视化里非常常用的操作——毕竟N×N的共现矩阵是高维数据,必须压缩到2维平面才能用散点图展示聚类效果。不过有几个细节可以调整,让你的可视化更贴合你原本的聚类流程,也能让结果更直观:
先聚类再降维(用原始聚类标签来画图)
你当前的代码里,是先对共现矩阵做PCA降维,然后在降维后的数据上重新跑了Kmeans得到标签,但这和你原本「用共现矩阵训练Kmeans」的流程脱节了。正确的顺序应该是:- 先在原始共现矩阵上训练好你的Kmeans模型,拿到每个词的聚类标签
- 再对共现矩阵做PCA(或其他降维方法)压缩到2D
- 最后用降维后的坐标和原始的聚类标签来画散点图
这样可视化的才是你最初基于共现矩阵得到的聚类结果,而不是降维后数据的聚类结果。
除了PCA,还有更适合文本的降维选项
PCA是线性降维,适合保留全局的线性结构,但文本共现矩阵往往是非线性的,你可以试试这些方法:- t-SNE:对非线性结构的捕捉更好,能让相似的聚类更紧凑、不同聚类更分开,不过计算速度比PCA慢一些,适合词表规模不是特别大的情况
- UMAP:和t-SNE类似,但保留全局结构的能力更强,计算效率也不错,适合更大的词表
用法和PCA差不多,比如t-SNE的代码示例:
from sklearn.manifold import TSNE import matplotlib.pyplot as plt from sklearn.cluster import KMeans # 先在共现矩阵上训练Kmeans,得到原始标签 km = KMeans(n_clusters=3) original_labels = km.fit_predict(mat) # 用t-SNE降维 tsne_2d = TSNE(n_components=2, perplexity=10) reduced = tsne_2d.fit_transform(mat) # 画图 plt.scatter(reduced[:, 0], reduced[:, 1], c=original_labels) plt.title("K-means Clustering (based on co-occurrence matrix)") plt.show()给散点加上词标签,让可视化更有意义
光看彩色散点还不够直观,你可以给每个点加上对应的词,这样一眼就能看到每个聚类里的具体词汇:# 假设your_word_list是你处理后的所有唯一词的列表 for i, word in enumerate(your_word_list): plt.text(reduced[i, 0], reduced[i, 1], word, fontsize=8, ha='center')
总的来说,PCA是完全正确且基础的可行方法,如果你觉得聚类的区分度不够,就换t-SNE或UMAP试试,核心是要保证可视化用的标签是你基于共现矩阵训练出的Kmeans结果,而不是降维后重新聚类的标签。
备注:内容来源于stack exchange,提问作者Thomas Stokes
相关产品推荐
相关产品推荐

