python - 使用 TF-IDF 在 K 均值中绘制质心

标签 python matplotlib seaborn k-means tf-idf

我正在使用 KMeans 进行编码以对文本进行分组,一切正常,但我无法将质心绘制在一起。我不知道如何使用 matplotlib,只知道 seaborn 以及 tdidf 创建的向量。

MiniBatchKMeans 具有变量 cluster_centers_,但我无法在图像中使用它。

from sklearn.feature_extraction.text import TfidfVectorizer
df_abstracts = df_cleared['abstract'].tolist() # list with 33,000 lines of strings

tfidf = TfidfVectorizer(max_features=2**12, ngram_range=(1,4), stop_words = 'english')
vextorized = tfidf.fit_transform(df_abstracts)

#For the plot generation, I do this dimensionality reduction from 33,000 to 2.
from sklearn.decomposition import PCA
pca = PCA(n_components = 9)
X_pca = pca.fit_transform(vextorized.toarray())

from sklearn.cluster import MiniBatchKMeans
kmeans = MiniBatchKMeans(init='k-means++', n_clusters=4, max_iter=500, n_init=10, 
                         random_state=9)

y_pred = kmeans.fit_predict(vextorized)
np.unique(y_pred)

palette = sns.color_palette('bright', len(set(y_pred)))
sns.scatterplot(X_pca[:,0], X_pca[:, 1], hue=y_pred, legend='full', palette=palette)
plt.title('Clustered')

最佳答案

您对原始数据进行了 k 均值聚类,因此对于投影到 PCA 空间的中心,您需要再次对其进行转换。

我使用示例数据集:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import PCA
from sklearn.cluster import MiniBatchKMeans
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

categories = ['rec.sport.baseball', 'sci.electronics',
              'comp.os.ms-windows.misc', 'talk.politics.misc']

newsgroups = fetch_20newsgroups(subset='train',
                                      categories=categories)

X_train = newsgroups.data
y_train = newsgroups.target

tfidf = TfidfVectorizer(max_features=2**12, ngram_range=(1,4), stop_words = 'english')
vextorized = tfidf.fit_transform(X_train)

这部分在执行 pca 时,需要保留拟合,以便可以使用它来投影 kmeans 中心:

pca = PCA(n_components = 9).fit(vextorized.toarray())
X_pca = pca.transform(vextorized.toarray())

这是带有实际标签的数据的样子:

labels = [newsgroups.target_names[i] for i in y_train]
sns.scatterplot(X_pca[:,0], X_pca[:, 1], hue=labels, legend='full',palette="Set2")

enter image description here

现在 k 意味着:

kmeans = MiniBatchKMeans(init='k-means++', n_clusters=4, max_iter=500, n_init=10, 
                         random_state=777)
y_pred = kmeans.fit_predict(vextorized)
palette = sns.color_palette('bright', len(set(y_pred)))
sns.scatterplot(X_pca[:,0], X_pca[:, 1], hue=y_pred, legend='full', palette=palette)
plt.title('Clustered')

我们将中心投影到前两个组件上并绘制它们:

centers_on_PCs = pca.transform(kmeans.cluster_centers_)
plt.scatter(x=centers_on_PCs[:,0],y=centers_on_PCs[:,1],s=200,c="k",marker="X")

enter image description here

关于python - 使用 TF-IDF 在 K 均值中绘制质心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61947343/

相关文章:

来自一系列图像的python 16位灰度视频

python - PyCharm - matplotlib(和其他导入模块)的自动完成

Python:努力掩盖数据集的一部分

python - 在 pylab 图形窗口中绘制文本

python - “模块”对象没有属性 'corrplot'

python - 将图与热图配对(可能是对数的)?

python - Pandas 在另一列中出现某个值之前选择行的子集

python - 从 NumPy 矩阵中满足条件的每一行中取 N 个第一个值

python - 当测试位于同级文件夹中时,通过命令行运行单个测试

python - 如何在 Subplot 中绘制多个 Seaborn Jointplot