基于Matplotlib的特征可视化:高维特征降维绘图问题咨询
解决高维特征散点图可视化的维度不匹配问题
刚好遇到过类似的情况,Matplotlib的散点图要求每个样本对应一个二维坐标点(x,y),而你的2048维特征直接用的话维度完全不匹配,所以核心思路是先把高维特征降维到2维,再按标签着色绘制散点图。下面给你两种最常用的实现方案:
方法1:PCA线性降维(快速,保留全局结构)
PCA是线性降维方法,计算速度快,适合大规模数据,能保留数据的全局分布结构。
import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA # 替换成你的真实数据:X是(200, 2048)的特征矩阵,y是(200,)的标签数组 X = np.random.rand(200, 2048) # 模拟特征数据 y = np.random.randint(0, 10, size=200) # 模拟标签(假设是0-9的整数) # 初始化PCA,将特征降到2维 pca = PCA(n_components=2) X_2d = pca.fit_transform(X) # 绘制按标签着色的散点图 plt.figure(figsize=(10, 8)) # c=y 表示用标签值映射颜色,cmap选你喜欢的配色方案 scatter_plot = plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y, cmap='viridis', alpha=0.7) # 添加颜色条说明标签对应颜色 plt.colorbar(scatter_plot, label='标签') plt.title('PCA降维后的特征散点图') plt.xlabel('主成分1') plt.ylabel('主成分2') plt.show()
方法2:t-SNE非线性降维(可视化效果更好,适合聚类)
t-SNE是非线性降维方法,能更好地保留样本间的局部聚类关系,可视化效果更直观,但计算速度比PCA慢一点(200样本完全没问题)。
import numpy as np import matplotlib.pyplot as plt from sklearn.manifold import TSNE # 同样替换成你的真实数据 X = np.random.rand(200, 2048) y = np.random.randint(0, 10, size=200) # 初始化t-SNE,perplexity参数建议设为5-50(样本数200的话30很合适) tsne = TSNE(n_components=2, perplexity=30, random_state=42) X_2d_tsne = tsne.fit_transform(X) # 绘制散点图 plt.figure(figsize=(10, 8)) scatter_plot = plt.scatter(X_2d_tsne[:, 0], X_2d_tsne[:, 1], c=y, cmap='tab10', alpha=0.7) plt.colorbar(scatter_plot, label='标签') plt.title('t-SNE降维后的特征散点图') plt.xlabel('t-SNE维度1') plt.ylabel('t-SNE维度2') plt.show()
一些小提示
- 如果你的标签是字符串类型(比如分类名称),可以先用
sklearn.preprocessing.LabelEncoder把它转换成数值再传入c参数 - t-SNE的
random_state参数建议固定,这样每次运行得到的降维结果一致,方便对比 - 可以调整
cmap参数更换配色,比如'rainbow'、'tab20'都是常用的多分类配色 - 如果样本量很大,优先选PCA;如果更关注样本间的聚类关系,选t-SNE
内容的提问来源于stack exchange,提问作者ahmed osama
相关产品推荐
相关产品推荐

