如何优化T-SNE实现以更好可视化K-Means聚类结果?
K-means聚类T-SNE可视化效果差的优化方案
问题背景
- 实验所用数据集维度为
(248857, 11),因K-means等基于距离的聚类算法要求特征缩放,已使用StandardScaler完成特征标准化处理。 - 标准化前数据分布:

- 标准化后数据分布:

- 实验设置聚类数为3完成K-Means训练,选择T-SNE作为降维可视化方案,但输出效果未达预期,原始实现代码如下:
# save the clusters into a variable l. l = df_scale['clusters'] d = df_scale.drop("clusters", axis = 1) standardized_data = StandardScaler().fit_transform(d) # TSNE Picking the top 100000points as TSNE data_points = standardized_data[0:100000, :] labels_80 = l[0:100000] model = TSNE(n_components = 2, random_state = 0) tsne_data = model.fit_transform(data_points) # creating a new data frame which help us in ploting the result data tsne_data = np.vstack((tsne_data.T, labels_80)).T tsne_df = pd.DataFrame(data = tsne_data, columns =("Dimension1", "Dimension2", "Clusters")) # Ploting the result of tsne sns.FacetGrid(tsne_df, hue ="Clusters", size = 6).map( plt.scatter, 'Dimension1', 'Dimension2').add_legend() plt.show()
- 当前代码输出的T-SNE可视化效果:

具体优化步骤
1 修复代码硬伤
现有代码两个问题直接导致可视化失真:
- 重复标准化:
df_scale本身就是标准化完成后附带聚类标签的数据集,T-SNE环节再次对特征执行StandardScaler().fit_transform()属于二次缩放,会直接扭曲K-means聚类时依托的特征空间距离关系,删掉这步重复操作即可。 - 顺序采样偏差:直接截取前10万行样本的方式,在数据集按特征值、采集时间等规则排序时,会导致子样本完全无法代表整体分布,替换为无放回随机采样:
# 替换原有顺序切片逻辑 sample_num = 100000 sample_idx = np.random.choice(d.shape[0], size=sample_num, replace=False) data_points = d.values[sample_idx, :] # d是删去聚类标签的标准化后特征 labels_sample = l[sample_idx]
2 调整T-SNE参数适配大样本场景
默认T-SNE参数针对小样本设计,对10万级、11维的数据适配性极差,重点调整以下参数:
- 预降维去噪:先用PCA将特征降到保留90%方差的维度(通常11维特征会降到5~8维),过滤噪声同时加快T-SNE运行速度,避免高维噪声干扰距离计算。
- 核心参数调整:
perplexity从默认30调到200500区间(样本量越大,该参数需要匹配更高的近邻计算数);`n_iter`从默认1000调到30005000保证收敛;初始化方式选init='pca'替代随机初始化,结果稳定性提升明显;学习率设为'auto',让算法根据样本量自动匹配最优值。
调参后的核心代码参考:
from sklearn.decomposition import PCA # PCA预降维 pca = PCA(n_components=0.9, random_state=0) pca_data = pca.fit_transform(data_points) # 调优后的T-SNE model = TSNE( n_components=2, random_state=0, perplexity=300, learning_rate='auto', n_iter=4000, init='pca' ) tsne_data = model.fit_transform(pca_data)
3 优化绘图呈现效果
现有绘图逻辑下10万个散点默认大小、完全不透明,重叠后会糊成一团无法分辨簇边界,做两个调整:
- 散点大小设为
s=2,增加alpha=0.3透明度参数,通过重叠区域的颜色深浅自然呈现样本密度。 - 可额外叠加核密度估计等高线,圈出每个聚类的95%分布范围,簇边界会更清晰。
4 排查聚类本身的质量问题
如果以上调整后可视化依然没有清晰的簇边界,不要继续纠结降维参数:先用PCA直接把特征降到2维快速验证,如果PCA下三个簇依然完全混杂,说明问题不在可视化环节,而是K-means聚类本身效果差——可能是特征对聚类任务的区分度不足、簇数设置不合理、特征存在异常值未处理,需要回头调整聚类流程。
如果追求更快的降维速度和更好的全局结构保留效果,也可以直接替换T-SNE为UMAP算法,大样本下的聚类可视化效果通常优于默认参数的T-SNE。
内容的提问来源于stack exchange,提问作者linuxpanther
相关产品推荐
相关产品推荐

