博主比较懒,不想写描述了。不过只要愿意静下心来看一下代码,应该会很有收获。
只显示样本点,不显示类别名称,效果如下:
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()