python t-sne降维可视化, 显示类别名称, 多种颜色

 

博主比较懒,不想写描述了。不过只要愿意静下心来看一下代码,应该会很有收获。

只显示样本点,不显示类别名称,效果如下:

X_tsne = tsne.fit_transform(dataset_x)  # dataset [N, dim]
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne-x_min)/(x_max-x_min)  
plt.figure(figsize=(8,8))
colors = cm.rainbow(np.linspace(0,1,len(label)))    # 定义多种颜色
for i in range(len(X_norm)):
    plt.text(X_norm[i,0], X_norm[i,1], '.', color=colors[label[i]],fontdict={'weight': 'bold', 'size':9})
plt.xticks([])
plt.yticks([])
plt.title('test')
plt.savefig('cluster.jpg')
plt.show()

如果想看出每种颜色到底代表哪一类,那么需要将类别名称也要画上去。

问题在于怎么将类别名称定位到图片中的位置呢?

解决方案:将每一个簇求均值,作为这个类的中心点。

完整代码:

 

X_tsne = tsne.fit_transform(dataset_x)  # dataset [N, dim]
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne-x_min)/(x_max-x_min)  
plt.figure(figsize=(8,8))
colors = cm.rainbow(np.linspace(0,1,len(label)))    # label是标签,我这里每个标签的元素是一个元组

#####  统计每个簇的中心坐标 ####
group = [[] for _ in range(len(label))]
for i in range(len(X_norm)):
    group[label[i]].append(X_norm[i])
id_posi = []
for i in range(len(label)):
    id_posi.append(np.mean(np.array(group[i]), 0))

# id2name 是一个字典,根据id找到name
for i in range(len(label)):
    plt.text(id_posi[i][0], id_posi[i][1], id2name[label[i]], color=colors[i],fontdict={'weight': 'bold', 'size':9})
#####----------------------#####
for i in range(len(X_norm)):
    plt.text(X_norm[i,0], X_norm[i,1], '.', color=colors[label[i]],fontdict={'weight': 'bold', 'size':9})
plt.xticks([])
plt.yticks([])
plt.title('test')
plt.savefig('cluster.jpg')
plt.show()

 


版权声明:本文为Answer3664原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。