高分SCI必备!t-SNE降维,2个应用示例,特征可视化,可解释性,深度学习故障识别,回归预测的必备工具!不信你还不会!

适用平台:Matlab2021及以上

你肯定见过这些顶级期刊在做论文中的特征可视化工具:t-SNE;出来的图都非常好看,能够给专家及读者留下非常好的印象,这是科研的必备工具!尽快拿下!

t-SNE的作用:当我们处理高维数据时,很难直观地理解数据之间的关系。t-SNE的目标是帮助我们在一个更低维度的空间中(通常是2D或3D)对数据进行可视化,同时保留数据点之间的相似性关系。通过一些数学变换,将原始信息从复杂的高维度(比如100维)变成一个简单的低维度(比如2维或3维)的样本分布图。

计算步骤:

  • t-SNE的核心思想是保持高维空间中数据点之间的相似性关系,尽量在低维空间中保持相似的关系。简单说,如果在高维空间中两个点很相似,它们在降维后的低维空间中仍然要尽量保持相似。

  • 这个算法的数学原理涉及到概率分布和距离的概念。它首先计算高维空间中点与点之间的相似性,使用一个概率分布来表示这种相似性。然后,在低维空间中,它再计算点与点之间的相似性,并构建另一个概率分布。

  • t-SNE的目标是最小化这两个概率分布之间的差异,以确保高维空间中相似的点在低维空间中仍然保持相似。这个差异通常通过使用KL散度(Kullback-Leibler divergence)来衡量。

简而言之,t-SNE让我们在一个更容易理解的低维空间中看到数据点,同时尽量保持原始数据点之间的相似性关系。这使得我们可以更好地理解数据的结构和模式,特别是在局部区域内的关系。

示例1:高维数据进行低维空间可视化

数据的特征(维度)越高,就越难以在低维空间中进行绘制,没有明显的规律性(散乱);用t-SNE降维成二维或者三维较低空间时,数据样本的分布呈现出一定的规律(聚合)。

示例2:CNN-SVM卷积-支持向量机神经网络输入与输出的特征对比

观察刚输入的原始故障样本分布和模型提取特征后全连接层的样本特征分布。

原始样本分布:(样本分散,分布混乱,无明显规律)

模型提取特征后的样本分布:(不同故障样本分离,同类故障样本聚合,特征提取成功)

结果分析:与原始样本相比较,经特征提取后数据样本同类聚合明显,说明CNN-SVM网络模型具有很强的特征提取能力,可以实现有效的故障识别。

部分代码:

完整代码:https://mbd.pub/o/bread/ZZqamJls
%% 绘制原始数据分布散点图
figure;
hold on;
colors = hsv(num_classes);
scatter_handles = gobjects(1, num_classes);
for class_idx = 1:num_classes
    start_idx = (class_idx-1)*num_samples_per_class+1;
    end_idx = class_idx*num_samples_per_class;
    scatter_handles(class_idx) = scatter(data(1, start_idx:end_idx), data(2, start_idx:end_idx), 25, colors(class_idx, :), 'filled');
end
hold off;
xlabel('特征1');
ylabel('特征2');
title([num2str(num_classes) '类不同数据样本原始分布']);

% 在右侧显示故障类型
legend_text = cell(1, num_classes);
for class_idx = 1:num_classes
    legend_text{class_idx} = sprintf('故障类型 %d', class_idx);
end
legend(scatter_handles, legend_text, 'Location', 'eastoutside');


%% 使用 t-SNE 进行降维
tsne_data = tsne(data');

%% 绘制降维后的分布图和图例
figure;
hold on;
scatter_handles = gobjects(1, num_classes);
for class_idx = 1:num_classes
    start_idx = (class_idx-1)*num_samples_per_class+1;
    end_idx = class_idx*num_samples_per_class;
    scatter_handles(class_idx) = scatter(tsne_data(start_idx:end_idx, 1), tsne_data(start_idx:end_idx, 2), 25, colors(class_idx, :), 'filled');
end
hold off;
xlabel('特征维度1');
ylabel('特征维度2');
title([num2str(num_classes) '类不同数据样本的t-SNE降维分布二维图']);

% 在右侧显示故障类型的图例
legend_text = cell(1, num_classes);
for class_idx = 1:num_classes
    legend_text{class_idx} = sprintf('故障类型 %d', class_idx);
end
legend(scatter_handles, legend_text, 'Location', 'eastoutside');

欢迎感兴趣的小伙伴通过代码上方链接联系小编获得完整版代码哦~

内容概要:本文详细介绍了利用 Python 实现 t-SNE 可视化的过程及其应用价值。首先讨论了高数据所带来的“度灾难”这一难题,并指出了 t-SNE 如何作为一种有效的解决方案来应对这种情况。接着深入剖析了 t-SNE 工作机制——该算法致力于保存高空间中的局部结构特性并在二或者三的空间内再现出来。随后,文中给出了完整的项目流程,涵盖数据加载与预处理、处理再到最后可视化呈现步骤的具体说明;与此同时提及了几项关键技术和优化措施用以提升计算效率与准确度。此外,作者强调了几个实际应用场景,证明了这一技术能够在计算机视觉、自然语言处理等多个领域发挥重要作用。 适用人群:适用于从事数据科学研究和技术开发者,尤其是那些希望掌握更多关于高数据理解和技巧的人士。 使用场景及目标:本教程的目标是为了使高数据可以通过直观的方式被展示出来。对于使用者来说,它可以用于评估现有数据集,探索未明模式或群体结构,或是作为工具来进行更高级别建模之前的特征工程准备阶段。另外也可供教育目的使用,教授学生有关现代方法的知识以及编程实践经验。 其他说明:考虑到性能限制及其它因素的影响,在实践中应注意调整相关参数以达到最佳表现,并且充分认识到可视化结果背后可能存在一定的不确定性和解释边界。
以下是使用 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 数据集进行测试,可以替换成其他数据集。运行代码后将会显示出后的特征向量的散点图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值