【发布时间】:2020-05-15 16:12:39
【问题描述】:
我在 Doc2Vec 模型的文档嵌入上拟合了 Kmeans 模型,以对嵌入进行聚类并获得可视化效果以及每个聚类中最常用的术语。我已经能够很好地做到这一点,并且每次都能获得相同的可视化效果。
当我在模型上运行 kmeans.fit_predict 时,它会根据我指定的集群为我提供一个集群标签列表,该集群的长度与我拥有的文档嵌入数量相同。多次运行模型时会出现问题,它每次都会为每个集群提供类似的分布,但集群标签会在多次运行后发生变化。例如,
- 运行 1 - 0:100、1:100、2:10
- 运行 2 - 0:99 , 1:101, 2:10
- 运行 3 - 2:100、0:100、1:10
- 运行 4 - 0:100、1:100、2:10
我尝试保存模型并多次使用相同的模型,但遇到了同样的问题。这会导致每个集群最常见的术语和集群在可视化中的位置发生变化,从而改变它的解释方式。我打算使用标签作为分类方法,但这不是不可能吗?我不确定这是否是我的代码的问题,或者这是否是正常行为,如果有人可以提供帮助,将不胜感激。
df = pd.read_csv("data.csv")
d2v_model = Doc2Vec.load("d2vmodel")
clusters = 3
iterations = 100
kmeans_model = KMeans(n_clusters=clusters, init='k-means++', max_iter=iterations)
X = kmeans_model.fit(d2v_model.docvecs.vectors_docs)
l = kmeans_model.fit_predict(d2v_model.docvecs.vectors_docs)
labels = kmeans_model.labels_.tolist()
pca = PCA(n_components=2).fit(d2v_model.docvecs.vectors_docs)
datapoint = pca.transform(d2v_model.docvecs.vectors_docs)
df["clusters"] = labels
cluster_list = []
cluster_colors = ["#FFFF00", "#008000", "#0000FF"]
plt.figure
color = [cluster_colors[i] for i in labels]
plt.scatter(datapoint[:, 0], datapoint[:, 1], c=color)
centroids = kmeans_model.cluster_centers_
centroidpoint = pca.transform(centroids)
plt.scatter(centroidpoint[:, 0], centroidpoint[:, 1], marker="^", s=150, c="#000000")
plt.show()
for i in range(clusters):
df_temp = df[df["clusters"]==i]
cluster_words = Counter(" ".join(df_temp["Body"].str.lower()).split()).most_common(25)
[cluster_list.append(x[0]) for x in cluster_words]
cluster_list.clear()
【问题讨论】:
标签: python machine-learning k-means doc2vec