正文
.
legend
()
plt
.
title
(
"t-SNE visualization of sentence embeddings"
)
plt
.
xlabel
(
"Dimension 1"
)
plt
.
ylabel
(
"Dimension 2"
)
plt
.
show
()
三维可视化分析
为了更全面地理解数据的分布特征,进一步进行三维可视化:
frommpl_toolkits.mplot3dimportAxes3D
# 使用3D t-SNE进行降维
tsne=TSNE(n_components=3, random_state=42, perplexity=30, n_iter=1000)
embeddings_3d=tsne.fit_transform(embeddings)
# 3D可视化绘制
fig=plt.figure(figsize=(12, 8))
ax=fig.add_subplot(111, projection="3d")
topics=df["topic"].tolist()
unique_topics=list(set(topics))
colors=plt.cm.get_cmap("tab10", len(unique_topics))
fori, topicinenumerate(unique_topics):
indices= [jforj, tinenumerate(topics) ift==topic]
ax.scatter(
embeddings_3d[indices, 0],
embeddings_3d[indices, 1],
embeddings_3d[indices, 2],
label=topic,
alpha=0.6,
color=colors(i),
s=20 # 标记大小
)
ax.set_title("3D t-SNE visualization of sentence embeddings")
ax.set_xlabel("Dimension 1")
ax.set_ylabel("Dimension 2")
ax.set_zlabel("Dimension 3")
ax.legend()
plt.show()
通过可视化分析可以观察到以下特征:各主题类别在空间中形成了清晰的分离边界,每个主题内部的句子呈现紧密的聚集分布,表明主题内部具有较高的相似性。虽然在瑜伽和宗教主题之间存在一定程度的重叠,但总体而言,嵌入向量表现出良好的区分性能力。
聚类算法对比分析
基于数据集中已标注的主题信息,我们将对比已知聚类数量和未知聚类数量两种情况下不同算法的性能表现。
1、K-Means聚类算法
K-Means算法适用于数据集规模较大、聚类数量已知、且聚类呈现相似大小和近似球形分布的场景。不推荐在聚类形状和大小存在显著差异、聚类数量未知,或存在大量异常值的情况下使用该算法。
评估指标采用轮廓系数(Silhouette Score)和调整兰德指数(Adjusted Rand Index):
fromsklearn.clusterimportKMeans
fromsklearn.metricsimportsilhouette_score, adjusted_rand_score
# 设置聚类数量(等于数据集中唯一主题的数量)
n_clusters=len(df["topic"].unique())
# 执行K-Means聚类
kmeans=KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
labels=kmeans.fit_predict(embeddings_2d)
# 性能评估
# 轮廓系数计算
sil_score=silhouette_score(embeddings_2d, labels)
print(f"Silhouette Score: {sil_score:.4f}")
# 调整兰德指数计算
# ARI范围为-1到1(1表示完美匹配,0表示随机分配,-1表示完全相反)
ari_score=adjusted_rand_score(df["topic"], labels)
print(f"Adjusted Rand Index (ARI): {ari_score:.4f}")
K-Means算法取得了轮廓系数0.5951的成绩,这在0.5-0.7的范围内表示聚类结果具有合理的质量和清晰的分离性。该分数表明数据点与其所属聚类具有良好的匹配度,并与相邻聚类保持明显的区别。调整兰德指数达到0.9130,这是一个相当优秀的成绩。由于ARI将聚类结果与真实主题标签进行对比,0.91的分数意味着算法输出与真实情况高度一致。
2、DBSCAN聚类算法
DBSCAN(基于密度的空间聚类)适用于聚类形状未知、聚类数量未知、存在异常值的场景,特别适合SBERT嵌入向量(默认使用余弦相似度)。该算法不适用于嵌入向量维度过高、需要精确选择eps和min_samples参数、数据集规模极大,或密度变化剧烈的情况。
由于聚类数量未知,结果的可视化展示更有助于理解算法性能:
fromsklearn.clusterimportDBSCAN
fromsklearn.metricsimportsilhouette_score, adjusted_rand_score
dbscan=DBSCAN(eps=2.9, min_samples=5)
labels=dbscan.fit_predict(embeddings_2d)
# 性能评估
# 轮廓系数计算(仅在存在多个聚类时计算,排除噪声点)
n_clusters=len(set(labels)) - (1if-1inlabelselse0)
ifn_clusters>1: