如何使用TSNE可视化高维数据的类别可分性,解决出图全为直线的问题
导致输出全在直线上的核心错误点
- 最核心逻辑漏洞:代码完全没有调用TSNE完成降维操作。你把标准化后的原始高维矩阵,同时作为散点图的x值和y值传入
scatter()接口——传入的x和y完全一致,matplotlib必然把所有点渲染在y=x的对角直线上,和TSNE的实际可视化效果没有任何关联。 - 绘图流程存在多处逻辑错误:
- 逐样本遍历标签,每循环一次就把全量高维数据重新绘制一遍,同时把整组类别列表直接传入图例参数,会导致图层重叠、图例重复错乱
- 将
plt.show()写在循环内部,每处理一个样本就弹出一次绘图窗口,根本无法累积生成完整的散点图 - 冗余导入不存在的自定义模块
import label as label,这行代码执行时会直接抛出导入错误,根本无法走到后续绘图步骤
- 导入的TSNE、PCA接口完全没有被实际调用,相当于工具准备齐全但没有执行任何降维操作。
修正后的实现逻辑
- 删除冗余的错误导入行,理顺数据加载、标签拆分的流程
- 保留数据标准化步骤,对维度超过50的高维数据集,先通过PCA预降到50维,解决直接跑TSNE计算慢、结果不稳定的问题
- 调用TSNE接口,将预处理后的高维数据映射到2维空间,得到每个样本对应的(x,y)坐标
- 按类别分组筛选样本,同一类别的所有样本一次性完成散点绘制,每个类别仅添加一次图例,所有绘图操作完成后再统一调用接口展示图像
修正后的完整可运行代码
import pandas as pd from matplotlib import pyplot as plt from sklearn.manifold import TSNE from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # 加载数据集 filename = 'Dataset/test.csv' df = pd.read_csv(filename) # 拆分标签列与特征列 label = df.pop('Activity') label_counts = label.value_counts() # 特征标准化 scale = StandardScaler() scaled_data = scale.fit_transform(df) # 高维数据PCA预降维(高维数据集标配步骤,提升TSNE稳定性) pca = PCA(n_components=min(50, scaled_data.shape[1] - 1)) pca_data = pca.fit_transform(scaled_data) # TSNE降维到2维空间 tsne = TSNE(n_components=2, random_state=42, perplexity=30) tsne_2d = tsne.fit_transform(pca_data) # 绘制散点图 plt.figure(figsize=(12, 8)) # 遍历所有类别绘制对应样本点 for class_name in label.unique(): class_mask = (label == class_name) x_coord = tsne_2d[class_mask, 0] y_coord = tsne_2d[class_mask, 1] plt.scatter(x_coord, y_coord, label=class_name, alpha=0.7) # 添加图像标注 plt.legend(title="Activity类别") plt.title("TSNE高维数据可分性可视化") plt.xlabel("TSNE第一维度") plt.ylabel("TSNE第二维度") # 所有绘图操作完成后展示图像 plt.show()
调试小提示:如果运行后发现样本点过度聚集、类间区分不明显,可以根据数据集的样本规模调整
perplexity参数(一般取样本量平方根附近,取值范围5-50),不要直接套用默认参数适配所有数据集。
内容的提问来源于stack exchange,提问作者Creator_py
相关产品推荐
相关产品推荐

