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()

 

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用 PyTorch 和 scikit-learn 实现的 DANN 特征提取器 t-SNE 降维可视化代码: ```python import torch import torch.nn.functional as F import matplotlib.pyplot as plt from sklearn.manifold import TSNE # 加载数据集 train_loader = torch.utils.data.DataLoader( torchvision.datasets.MNIST('/files/', train=True, download=True, transform=torchvision.transforms.Compose([ torchvision.transforms.ToTensor(), torchvision.transforms.Normalize( (0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True) # 定义 DANN 特征提取器 class FeatureExtractor(torch.nn.Module): def __init__(self): super(FeatureExtractor, self).__init__() self.conv1 = torch.nn.Conv2d(1, 64, kernel_size=5) self.conv2 = torch.nn.Conv2d(64, 50, kernel_size=5) self.conv2_drop = torch.nn.Dropout2d() self.fc1 = torch.nn.Linear(50*4*4, 100) self.fc2 = torch.nn.Linear(100, 10) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 50*4*4) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return x # 加载模型参数 model = FeatureExtractor() model.load_state_dict(torch.load('dann_feature_extractor.pth')) # 提取特征向量 features = [] labels = [] for data, target in train_loader: features.append(model(data).detach().numpy()) labels.append(target.detach().numpy()) features = np.concatenate(features, axis=0) labels = np.concatenate(labels, axis=0) # 使用 t-SNE 进行特征降维 tsne = TSNE(n_components=2, random_state=0) features_tsne = tsne.fit_transform(features) # 可视化降维后的特征向量 for i in range(10): plt.scatter(features_tsne[labels==i, 0], features_tsne[labels==i, 1], label=str(i)) plt.legend() plt.show() ``` 这里使用了 MNIST 数据集进行测试,可以替换成其他数据集。运行代码后将会显示降维后的特征向量的散点图。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值