在读基于深度学习的机械故障诊断论文时,不免会看到如下所示的t-SNE 可视化图,看着比较高级。那这个图又是如何绘制出来的呢?本文将通过mnist手写数据集来实现t-SNE

代码实现

# coding='utf-8'
"""t-SNE对手写数字进行可视化"""
from time import time
import numpy as np
import matplotlib.pyplot as pltfrom sklearn import datasets
from sklearn.manifold import TSNEdef get_data():digits = datasets.load_digits(n_class=6)data = digits.datalabel = digits.targetn_samples, n_features = data.shapereturn data, label, n_samples, n_featuresdef plot_embedding(data, label, title):x_min, x_max = np.min(data, 0), np.max(data, 0)data = (data - x_min) / (x_max - x_min)fig = plt.figure()ax = plt.subplot(111)for i in range(data.shape[0]):plt.text(data[i, 0], data[i, 1], str(label[i]),color=plt.cm.Set1(label[i] / 10.),fontdict={'weight': 'bold', 'size': 9})plt.xticks([])plt.yticks([])plt.title(title)return figdef main():data, label, n_samples, n_features = get_data()print('data.shape',data.shape) print('label',label)print('label中数字有',len(set(label)),'个不同的数字')print('data有',n_samples,'个样本')print('每个样本',n_features,'维数据')print('Computing t-SNE embedding')tsne = TSNE(n_components=2, init='pca', random_state=0)t0 = time()result = tsne.fit_transform(data)print('result.shape',result.shape)fig = plot_embedding(result, label,'t-SNE embedding of the digits (time %.2fs)'% (time() - t0))plt.show(fig)if __name__ == '__main__':main()
>>>输出结果
data.shape (1083, 64)
label [0 1 2 ... 4 4 0]
label中数字有 6 个不同的数字
data有 1083 个样本
每个样本 64 维数据
Computing t-SNE embedding
result.shape (1083, 2)

结果分析

由结果可知,需输入两个参数,data和label,其中data是一个2维数组(num,dim),label是1维数组,为对应的标签。
TSNE通过PCA降维之后输出的是result是一个2维数组(num, 2)。在这里将64维降到2维。最后绘图出来。

#1DCNN加t-sne实践
1、先构建一个1DCNN,本次用的是多尺度卷积神经网络(MSCNN)

模型参数见论文:基于多尺度卷积神经网络的电机故障诊断方法研究_王威

# 输入x = (batch, 1, 1024)的模型,输出结果为(64, 4)
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv1d(in_channels = 1,out_channels= 64,kernel_size = 32, stride = 8, padding = 12)self.pool1 = nn.MaxPool1d(kernel_size=2, stride=2)self.BN = nn.BatchNorm1d(num_features=64)self.conv3_1 = nn.Conv1d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1)self.pool3_1 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv3_2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1)self.pool3_2 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv3_3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1)self.pool3_3 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv5_1 = nn.Conv1d(in_channels=64, out_channels=64, kernel_size=5, stride=1, padding=2)self.pool5_1 = nn.MaxPool1d(kernel_size=2 , stride=2)self.conv5_2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=5, stride=1, padding=2)self.pool5_2 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv5_3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=5, stride=1, padding=2)self.pool5_3 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv7_1 = nn.Conv1d(in_channels=64, out_channels=64, kernel_size=7, stride=1, padding=3)self.pool7_1 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv7_2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=7, stride=1, padding=3)self.pool7_2 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv7_3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=7, stride=1, padding=3)self.pool7_3 = nn.MaxPool1d(kernel_size=2, stride=2)self.pool2 = nn.MaxPool1d(kernel_size=8, stride=1)self.fc = nn.Linear(in_features=256*3, out_features=4)  ##这里的4096是计算出来的self.softmax = nn.Softmax()def forward(self, x):x = self.conv1(x)  ## x:Batch, 1, 1024x = self.pool1(x)# kernel_size为3x1 = self.conv3_1(x)x1 = self.pool3_1(x1)x1 = self.conv3_2(x1)x1 = self.pool3_2(x1)x1 = self.conv3_3(x1)x1 = self.pool3_3(x1)# kernel_size为5x2 = self.conv5_1(x)x2 = self.pool5_1(x2)x2 = self.conv5_2(x2)x2 = self.pool5_2(x2)x2 = self.conv5_3(x2)x2 = self.pool5_3(x2)# kernel_size为7x3 = self.conv7_1(x)x3 = self.pool7_1(x3)x3  = self.conv7_2(x3)x3 = self.pool7_2(x3)x3 = self.conv7_3(x3)x3 = self.pool7_3(x3)# 池化层x1 = self.pool2(x1)x2 = self.pool2(x2)x3 = self.pool2(x3)# flatten展平Batch, Channel, Length = x1.size()x1 = x1.view(Batch, -1)Batch, Channel, Length = x2.size()x2 = x2.view(Batch, -1)Batch, Channel, Length = x3.size()x3 = x3.view(Batch, -1)#将3个尺度提取到的特征连接在一起x0 = torch.cat((x1, x2, x3), dim=1)  # 全连接层x = self.fc(x0)return x, x0

2、测试一下模型

x = torch.rand(64, 1, 1024)  #输入x大小:batch=64, channel=1, length=1024
model = Net()
(y, y0) = model(x)
print(y.shape)  #打印输出y大小
print(y0.shape)  #打印输出y0大小
output>>>
torch.Size([64, 4])
torch.Size([64, 768])

可以看出y的大小是[64, 4],是4分类的预测结果
y0的大小是[64, 768],是把3个尺度方向提取到的特征拼接在一起的结果。也可以把它理解为提取到的特征。

现在问题就是如何把它做t-sne图
从前面分析可知,做t-sne需输入两个参数,data和label,其中data是一个2维数组(num,dim),label是1维数组,为对应的标签。现在[64, 768]符合data大小要求,还差个label,这个用随机数生成一下。

label = torch.randint(low=0, high=4, size= (64, ))
print(label.shape)
>>>output
tensor([0, 3, 2, 2, 2, 0, 3, 2, 0, 0, 1, 3, 0, 3, 2, 2, 3, 2, 0, 1, 2, 1, 0, 2,0, 0, 1, 0, 2, 2, 1, 2, 1, 1, 3, 1, 0, 0, 0, 3, 3, 1, 3, 0, 0, 0, 3, 3,3, 1, 2, 3, 0, 2, 3, 0, 1, 0, 2, 0, 3, 1, 1, 2])

下面对y0和label做t-sne

tsne = TSNE(n_components=2, init='pca', random_state=0)
y0 = y0.detach().numpy()  #需从tensor类型转为array类型
label = label.detach().numpy()  #需从tensor类型转为array类型
result = tsne.fit_transform(y0)
fig = plot_embedding(result, label, title='tsne')
plt.show(fig)

输出图片:

因为数据都是随机生成的,所以数据分布也是随机的。然后其他每个类型的点用 * +这样标记还没研究。后续加上。

这样通过return y0,的确可以实现返回想要的层提取到的特征,但这样在实际应用中会遇到很多麻烦。

下面有个稍微简单一些的方法。

# 输入x = (batch, 1, 1024)的模型,输出结果为(64, 4)
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv1d(in_channels = 1,out_channels= 64,kernel_size = 32, stride = 8, padding = 12)self.pool1 = nn.MaxPool1d(kernel_size=2, stride=2)self.BN = nn.BatchNorm1d(num_features=64)self.conv3_1 = nn.Conv1d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1)self.pool3_1 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv3_2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1)self.pool3_2 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv3_3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1)self.pool3_3 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv5_1 = nn.Conv1d(in_channels=64, out_channels=64, kernel_size=5, stride=1, padding=2)self.pool5_1 = nn.MaxPool1d(kernel_size=2 , stride=2)self.conv5_2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=5, stride=1, padding=2)self.pool5_2 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv5_3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=5, stride=1, padding=2)self.pool5_3 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv7_1 = nn.Conv1d(in_channels=64, out_channels=64, kernel_size=7, stride=1, padding=3)self.pool7_1 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv7_2 = nn.Conv1d(in_channels=64, out_channels=128, kernel_size=7, stride=1, padding=3)self.pool7_2 = nn.MaxPool1d(kernel_size=2, stride=2)self.conv7_3 = nn.Conv1d(in_channels=128, out_channels=256, kernel_size=7, stride=1, padding=3)self.pool7_3 = nn.MaxPool1d(kernel_size=2, stride=2)self.pool2 = nn.MaxPool1d(kernel_size=8, stride=1)self.fc = nn.Linear(in_features=256*3, out_features=4)  ##这里的4096是计算出来的self.softmax = nn.Softmax()def forward(self, x):x = self.conv1(x)  ## x:Batch, 1, 1024x = self.pool1(x)# kernel_size为3x1 = self.conv3_1(x)x1 = self.pool3_1(x1)x1 = self.conv3_2(x1)x1 = self.pool3_2(x1)x1 = self.conv3_3(x1)x1 = self.pool3_3(x1)# kernel_size为5x2 = self.conv5_1(x)x2 = self.pool5_1(x2)x2 = self.conv5_2(x2)x2 = self.pool5_2(x2)x2 = self.conv5_3(x2)x2 = self.pool5_3(x2)# kernel_size为7x3 = self.conv7_1(x)x3 = self.pool7_1(x3)x3  = self.conv7_2(x3)x3 = self.pool7_2(x3)x3 = self.conv7_3(x3)x3 = self.pool7_3(x3)# 池化层x1 = self.pool2(x1)x2 = self.pool2(x2)x3 = self.pool2(x3)# flatten展平Batch, Channel, Length = x1.size()x1 = x1.view(Batch, -1)Batch, Channel, Length = x2.size()x2 = x2.view(Batch, -1)Batch, Channel, Length = x3.size()x3 = x3.view(Batch, -1)#将3个尺度提取到的特征连接在一起x0 = torch.cat((x1, x2, x3), dim=1)  # 全连接层x = self.fc(x0)# 将x0为定义类变量,方便其他类函数调用self.x0 = x0   return x#定义一个get_fea类函数,返回类变量x0def get_fea(self):return self.x0
x = torch.rand(64, 1, 1024) #输入x大小:batch=64, channel=1, length=1024
label = torch.randint(low=0, high=4, size= (64, )) #0-4之间随机生成整数,当做标签,输入label大小:batch=64
model = Net()
y = model(x) #输出是分类结果
y_fea = model.get_fea() #输出是提取到的特征
print('y的shape为:',y.shape)
print('y_fea的shape为:',y_fea.shape)
>>>output
y的shape为: torch.Size([64, 4])
y_fea的shape为: torch.Size([64, 768])

可见该方法更方便,如果想要某一层中间特征时,只要改动get_fea()里面函数要返回的参数即可。

tsne = TSNE(n_components=2, init='pca', random_state=0)
y_fea = y_fea.detach().numpy()
label = label.detach().numpy()
result = tsne.fit_transform(y_fea)
fig = plot_embedding(result, label, title='tsne')
plt.show(fig)

输出图片

##----4.30更新------##
前面出的图不是很漂亮,现在找了一个出图美观漂亮的程序,并定义了一个函数,大家使用的时候调用就好了,

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.manifold import TSNEdef plot_tsne(features, labels):''' features:(N*m) N*m大小特征,其中N代表有N个数据,每个数据m维label:(N) 有N个标签 '''import pandas as pdtsne = TSNE(n_components=2, init='pca', random_state=0)import seaborn as snsclass_num = len(np.unique(labels)) #要分类的种类个数  eg:[0, 1, 2, 3]这个就是为4latent = featurestsne_features = tsne.fit_transform(features)    #将特征使用PCA降维至2维print('tsne_features的shape:',tsne_features.shape)plt.scatter(tsne_features[:, 0], tsne_features[:, 1])   #将对降维的特征进行可视化plt.show()df = pd.DataFrame()df["y"] = labelsdf["comp-1"] = tsne_features[:,0]df["comp-2"] = tsne_features[:,1]sns.scatterplot(x="comp-1", y="comp-2", hue=df.y.tolist(),palette=sns.color_palette("hls", class_num),data=df).set(title="Bearing data T-SNE projection unsupervised") if __name__ == '__main__':digits = datasets.load_digits(n_class=5)features, labels = digits.data, digits.targetprint(features.shape)print(labels.shape)plot_tsne(features, labels)
>>>输出结果
features的shape: (901, 64)
labels.shape:  (901,)
tsne_features的shape: (901, 2)


print(labels)
>>>
[0 1 2 3 4 0 1 2 3...1 4 0 3 1 4 4 2 2 2 4 4 0]

如果想把lengend换成对应的中文,则需要把[0,1,2,3,4]换成对应的中文标签

欢迎关注我的公众号:《故障诊断与python学习》

tSNE-python代码实现及使用讲解相关推荐

  1. 自然语言处理实验—分词算法(含python代码及详细例子讲解)

    自然语言处理实验-分词算法 最近在学自然语言处理,这是第一个上机实验自然语言处理的分词算法,也是自然语言处理比较入门的算法.和大家分享一下. 首先,自然语言处理,英文是(Nature Language ...

  2. 卡尔曼滤波原理和Matlab以及python代码实现

    文章目录 前言 一.卡尔曼滤波原理 最后对卡尔曼滤波的预测步和更新步公式进行总结: 二.Matlab代码 三.Python代码 前言 本文主要讲解卡尔曼滤波的原理以及Matlab和python代码实现 ...

  3. Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现

    保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现 网络上Glcm的原理很多,但是实现的python代码我确实没找到,讲的也不是很清楚 此文介绍了如何在一张图 ...

  4. 2023年美赛C题Wordle预测问题一建模及Python代码详细讲解

    相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3)2023年美赛C题Wordl ...

  5. 2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解

    更新时间:2023-2-19 16:30 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详 ...

  6. 2023年美赛C题Wordle预测问题二建模及Python代码详细讲解

    更新时间:2023-2-19 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3 ...

  7. 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)

    文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...

  8. 小波包能量 - python代码讲解

    小波包能量 - python代码讲解 **1.本文背景** **2.小波包分解介绍** **3.文件介绍** **4.读取数据** 4.1 定义一个数据读取函数 4.2画时域图 **5.进行小波包变换 ...

  9. 模拟退火算法详细讲解(含实例python代码)

    模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...

  10. 常用正则表达式最强汇总(含 Python 代码举例讲解 + 爬虫实战)

    本文带大家学习正则表达式,并通过 python 代码举例讲解常用的正则表达式 最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析. 正则表达式语法 Python 的 re 模块(正则表达式 ...

最新文章

  1. 为何协作机器人能够兴起?“协作机器人-激烈的市场谁能杀出重围”
  2. Gevent异步服务类实现多姿势WEB实时展示
  3. 依图又斩获10冠!AI芯片拿下创新技术大奖,朱珑再谈智能密度
  4. OpenCV图像处理——对比两张图像差异的位置并标记
  5. SAP Spartacus PageMetaResolver 的单元测试
  6. SQL Server遗失管理权限账号密码怎么办?
  7. 怎么改字段名称_精装房这么改!换门框,封阳台,效果出来比毛坯房还好
  8. 信息学奥赛一本通 1229:电池的寿命 | OpenJudge NOI 4.6 2469:电池的寿命
  9. (转)用 Maven 部署 war 包到远程 Tomcat 服务器
  10. 【Elasticsearch】实用BM25 -第1部分: shard 如何影响Elasticsearch中的相关性评分
  11. 11_HTML5_Local_Storage本地存储
  12. 快切-开源中文css框架之纯css透明
  13. 基于Java技术的汽车维修管理软件的设计与实现
  14. 【WPS表格】一些简单函数
  15. 写给跨端玩家:支撑淘宝上亿日活的跨端框架—— Rax 的入门教程(附 TODO Demo)
  16. 靠五、六流人才铸造的18万华为铁军
  17. 纯代码实现WordPress文章部分内容关注微信公众号后可见
  18. 固实压缩文件容易损坏_你不知道的压缩软件小技巧1
  19. unity urp 实现丝绸渲染
  20. 怎么隐藏响应头中的server和X-Powered-By?

热门文章

  1. 苹果手机怎么定位安卓手机_64G苹果手机和128G的安卓手机,怎么选?
  2. 黄章遭遇“猪队友“!魅族16S pro全面曝光,网友:感谢提前泄密
  3. 新手必知的SEO快速排名可用的方法
  4. Ubuntu18.04(NVIDIA)使用网线连接华为路由器XD10无法ping通问题排查和轻解决
  5. Leetcode.1129 颜色交替的最短路径
  6. MPI和OpenMP混合编程实例
  7. flask 项目启动报错:OSError OSError: [Errno 22] Invalid argument
  8. 将整个html网页生成图片
  9. cv2.ADAPTIVE_THRESH_GAUSSIAN_C作用是什么
  10. OpenMediaVault6安装omv-extras