You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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可视化效果:
    当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:01:19