如何区分K-means聚类后两个原始嵌入数据集所属簇?
确定聚类簇与原始数据集的对应关系
可以通过以下几种简单方法匹配簇和原始的flattened_embeddings_d、flattened_embeddings_nd:
方法1:基于标签位置统计
因为你是按[flattened_embeddings_d, flattened_embeddings_nd]的顺序拼接的数据集,所以标签数组labels的前len(flattened_embeddings_d)个元素对应d的样本,后len(flattened_embeddings_nd)个元素对应nd的样本。直接统计两部分样本的标签分布:
# 获取两个原始数据集的长度 d_len = len(flattened_embeddings_d) nd_len = len(flattened_embeddings_nd) # 统计d样本的标签分布 d_labels = labels[:d_len] d_cluster = np.argmax(np.bincount(d_labels)) print(f"flattened_embeddings_d 对应簇 {d_cluster}") # 统计nd样本的标签分布 nd_labels = labels[d_len:] nd_cluster = np.argmax(np.bincount(nd_labels)) print(f"flattened_embeddings_nd 对应簇 {nd_cluster}")
如果聚类效果较好,某一类标签会在对应原始数据集中占绝对多数,直接取占比最高的簇即可。
方法2:对比初始质心与最终质心的距离
你初始化KMeans时用了d_means和nd_means,可以计算这两个初始质心与最终聚类质心centroids的欧氏距离,距离最近的就是对应簇:
from scipy.spatial.distance import euclidean # 计算d_means到两个最终质心的距离 dist_d_0 = euclidean(d_means, centroids[0]) dist_d_1 = euclidean(d_means, centroids[1]) # 计算nd_means到两个最终质心的距离 dist_nd_0 = euclidean(nd_means, centroids[0]) dist_nd_1 = euclidean(nd_means, centroids[1]) if dist_d_0 < dist_d_1: print("flattened_embeddings_d 对应簇0,flattened_embeddings_nd对应簇1") else: print("flattened_embeddings_d 对应簇1,flattened_embeddings_nd对应簇0")
这种方法适合初始化质心本身就是原始数据集均值的场景,能直接关联初始目标和最终聚类结果。
方法3:可视化时区分原始数据集
修改你的可视化代码,直接用不同标记区分原始的两个数据集,和聚类簇的颜色对应起来验证:
# 拆分回原始数据集 d_data = embeddings_concat[:d_len] nd_data = embeddings_concat[d_len:] # 绘制d的样本(用方形) plt.scatter(d_data[:,0], d_data[:,1], s=50, c='lightblue', marker='s', edgecolor='black', label='flattened_embeddings_d') # 绘制nd的样本(用圆形) plt.scatter(nd_data[:,0], nd_data[:,1], s=50, c='pink', marker='o', edgecolor='black', label='flattened_embeddings_nd') # 绘制聚类质心 plt.scatter(centroids[:,0], centroids[:,1], s=150, color='red', marker='*', edgecolor='black') plt.legend() plt.show()
对比这张图和你之前的聚类可视化图,就能直观看到哪个颜色的簇和哪个原始数据集重合度更高。
内容的提问来源于stack exchange,提问作者Djanger
相关产品推荐
相关产品推荐

