能否基于20维K-means聚类结果(簇中心+样本点)用UMAP做二维可视化?
20维K-means聚类结果的UMAP二维可视化实现
当然可以实现这个需求,核心思路是先通过UMAP将高维数据(样本点+簇中心)映射到二维空间,再分别按要求着色绘制。以下是具体的Python实现步骤:
准备工作
确保你已经安装了所需的库:
pip install umap-learn pandas matplotlib
代码实现
1. 导入库并加载数据
import umap import pandas as pd import matplotlib.pyplot as plt
2. 对样本点进行UMAP降维
假设df_points的最后一列是簇标签(列名比如为cluster),前20列是高维特征:
# 提取样本点的高维特征矩阵 X_points = df_points.iloc[:, :-1] # 初始化UMAP模型并训练(用样本点数据拟合) umap_transformer = umap.UMAP(n_components=2, random_state=42) points_2d = umap_transformer.fit_transform(X_points) # 将降维后的二维坐标添加到样本点数据框 df_points['umap_x'] = points_2d[:, 0] df_points['umap_y'] = points_2d[:, 1]
3. 用同一模型转换簇中心到二维空间
为了保证坐标空间一致,必须用训练好的UMAP模型转换簇中心:
# 提取簇中心的高维特征(假设列名与样本点的特征列完全匹配) X_centers = df_center # 转换簇中心到二维 centers_2d = umap_transformer.transform(X_centers) # 整理簇中心的二维坐标数据 df_centers_2d = pd.DataFrame({ 'umap_x': centers_2d[:, 0], 'umap_y': centers_2d[:, 1], 'cluster': df_center.index # 假设簇中心的索引就是簇编号 })
4. 绘制可视化图
plt.figure(figsize=(10, 8)) # 绘制样本点:按所属簇着色,添加透明度避免重叠 sample_scatter = plt.scatter( df_points['umap_x'], df_points['umap_y'], c=df_points['cluster'], cmap='tab20', # 17个簇用tab20色系足够区分 alpha=0.6, s=20 ) # 绘制簇中心:黑色大叉标记 plt.scatter( df_centers_2d['umap_x'], df_centers_2d['umap_y'], c='black', s=100, marker='X', label='簇中心' ) # 配置图例和标签 # 生成样本簇的图例项 cluster_legend = sample_scatter.legend_elements()[0] cluster_labels = [f'簇 {i}' for i in range(17)] # 添加簇中心的图例项 center_legend = plt.Line2D( [], [], marker='X', color='black', linestyle='', markersize=10, label='簇中心' ) plt.legend(handles=cluster_legend + [center_legend], labels=cluster_labels + ['簇中心']) plt.xlabel('UMAP 第一分量') plt.ylabel('UMAP 第二分量') plt.title('20维K-means聚类结果的UMAP二维可视化') plt.colorbar(sample_scatter) plt.show()
注意事项
- 务必保证
df_center的特征列与df_points的特征列完全一致,否则UMAP转换会报错 - 如果簇标签列不是最后一列,需要调整
X_points的提取方式(比如通过列名指定:X_points = df_points[['f0', 'f1', ..., 'f19']]) - 可以调整UMAP的参数(如
n_neighbors、min_dist)来优化降维后的聚类效果展示 - 若想用其他降维工具(比如t-SNE),只需替换UMAP部分为
sklearn.manifold.TSNE即可,逻辑完全一致
内容的提问来源于stack exchange,提问作者LJG
相关产品推荐
相关产品推荐

