科研绘图之tSNE图

t-SNE(t-Distributed Stochastic Neighbor Embedding,t分布随机邻域嵌入)是一种用于数据降维和可视化的算法。它可以将高维数据映射到二维或三维空间,同时尽可能地保留数据点之间的局部关系。t-SNE特别适用于探索数据的内部结构和模式,常用于聚类分析和发现数据中的群集。

在机器学习和数据分析中,t-SNE图通常用来展示数据点在降维后的分布情况,帮助观察数据点之间的相似性或差异性。通过t-SNE图,可以直观地看出数据点是否形成了明显的群集或者存在分离的趋势,有助于深入理解数据的结构和特征。

下面我给出两个具体案例,用python来实现tSNE图。

 

目录

一、RTE数据集绘制tSNE图

1.1 加载数据

1.2 加载模型获得特征

1.3 保存模型

1.4 绘制tSNE图

二、HUW数据集绘制tSNE图

2.1 加载数据

2.2 加载模型保存文件

2.3 绘制tSNE图


 

一、RTE数据集绘制tSNE图

1.1 加载数据

from transformers import RobertaTokenizer, RobertaModel
import torch
import numpy as np
import pandas as pd
import random
# 读取TSV文件
df = pd.read_csv("RTE/train.tsv", sep="\t", header=None) # 替换为您的文件路径
# 随机选择500个句子
# sentences = df.sample(5000)[1]  # 句子在第2列
random_samples = df.sample(500)

# 将第2列和第3列的句子拼接起来,两个句子之间用空格分隔
sentences = random_samples[1] + " " + random_samples[2]

sentences打印结果: 


129     The company, whose registered auditors are Del...
791     So far Sony BMG has not released a list of how...
1684    Analysts expected the company to earn $1.42 a ...
109     The University has also apologized for the inc...
1723    The nation got its long-awaited first look at ...
                              ...                        
2039    The International Olympic Committee has leapt ...
1381    Martha Stewart, 64, is back, after serving fiv...
570     President George W. Bush, who gave the keynote...
1519    A former philosophy teacher whose best-known n...
1318    Alan Mulally, Boeing's head of the unit, said ...
Length: 500, dtype: object

注意,绘制tSNE图,上面的数据加载部分只运行一次,来保证随机采样的数据相同。 

1.2 加载模型获得特征

# 定义model
model = RobertaModel.from_pretrained("/roberta-large")     # 加载预训练模型权重
# model.load_state_dict(torch.load('CoLA68.9_best_model_Original.pt'), strict=False) # PLM+softmax微调
# model.load_state_dict(torch.load('CoLA72.9_best_model_calculate_weight_diff.pt'), strict=False) # ours impl

# model.load_state_dict(torch.load('RTE_best_model_original.pt'), strict=False) # PLM+softmax微调
model.load_state_dict(torch.load('RTE89.3_calculate_weight_diff_model.pt'), strict=False) # ours impl

tokenizer = RobertaTokenizer.from_pretrained("/roberta-large")

# 获取Input Features
input_feature_list = list()

for sentence in sentences:
    inputs = tokenizer(sentence, return_tensors="pt", padding='max_length', truncation=True, max_length=128)
    input_ids = inputs['input_ids']
    attention_mask = inputs['attention_mask']
    input_feature = model(input_ids, attention_mask)[1]
    input_feature_list.append(input_feature.detach().cpu().numpy())

# 堆叠Input Features并保存
orign = np.vstack(input_feature_list)

orign.shape 


(500, 1024)

1.3 保存模型

# np.save('npy/rte_orign_roberta_1.npy',orign)
# np.save('npy/rte_orign_roberta_2.npy',orign)
np.save('npy/rte_roberta_AgDn_500.npy',orign)

# For plotting
import matplotlib.pyplot as plt
import seaborn as sns

#For standardising the dat
from sklearn.preprocessing import StandardScaler

#PCA
from sklearn.manifold import TSNE

# roberta_data = np.load('npy/cola_orign_roberta.npy')
roberta_data1 = np.load('npy/rte_roberta_FT_500.npy')
roberta_data2 = np.load('npy/rte_roberta_PT_500.npy')
roberta_data3 = np.load('npy/rte_roberta_AgDn_500.npy')

# 将所有数据组合在一起以便用t-SNE处理
combined_data = np.vstack([roberta_data1, roberta_data2, roberta_data3])

labels1 = [f'n{i}' for i in range(1, len(roberta_data1) + 1)]
labels2 = [f'n{i}' for i in range(1, len(roberta_data2) + 1)]
labels3 = [f'n{i}' for i in range(1, len(roberta_data3) + 1)]

combined_labels = labels1 + labels2 + labels3

注意,根据实际需要,要保存若干个npy文件,用作后面的tSNE绘图。 

combined_data预览


array([[-0.47165307,  0.5584102 , -0.3025265 , ...,  0.21222334,
         0.41210824, -0.48724136],
       [-0.433249  ,  0.45918941, -0.37311822, ...,  0.17242172,
         0.30651495, -0.53964025],
       [-0.6322939 ,  0.36898744, -0.20495233, ..., -0.16366315,
         0.45747212, -0.2154128 ],
       ...,
       [-0.05081458,  0.4187796 ,  0.19485527, ..., -0.8376309 ,
         0.20942022,  0.57146496],
       [ 0.70825064, -0.51524955,  0.516124  , ..., -0.53912795,
         0.7632115 , -0.71091646],
       [-0.10236336,  0.4357162 ,  0.01013089, ..., -0.78527933,
         0.20695496,  0.5769015 ]], dtype=float32)

len(combined_data) :1500

1.4 绘制tSNE图

# 应用t-SNE
tsne = TSNE(n_components=2,
            random_state=42,
            perplexity=19.5,
            n_iter=550,
            early_exaggeration=350)

tsne_results = tsne.fit_transform(combined_data)

# 设置绘图样式
# sns.set(style='white', context='notebook', rc={'figure.figsize': (5, 5), 'axes.edgecolor': 'gray', 'axes.linewidth': 0.5})
# 设置绘图样式,包括完全去掉边框
sns.set(style='white', context='notebook', rc={'axes.edgecolor': 'none', 'axes.linewidth': 0})

# 创建一个没有边框的画布
plt.figure(figsize=(5, 5), edgecolor='none')  # edgecolor='none' 移除绘图区域的边框

# 为每组数据选择不同的颜色
colors = ['red', 'blue', 'green']

# 第一组数据 plm--红色
plt.scatter(tsne_results[:500, 0], tsne_results[:500, 1], c=colors[0], label='Pre-Training', marker='o', s=5)

# 第二组数据 plm+softmax微调-- 蓝色
plt.scatter(tsne_results[500:1000, 0], tsne_results[500:1000, 1], c=colors[1], label='Fine-Tuning', marker='^', s=5)

# 第三组数据 our impl--绿色
plt.scatter(tsne_results[1000:, 0], tsne_results[1000:, 1], c=colors[2], label='AgDn', marker='s', s=5)


# 自定义图例的边框样式
legend = plt.legend(fontsize=8, loc='upper left', bbox_to_anchor=(0.0, 1.0), frameon=True, fancybox=True, edgecolor='black')
# legend = plt.legend(fontsize=10, loc='upper left',  frameon=True, fancybox=True, edgecolor='black')

# 获取图例的边框对象,并调整边框线条的宽度
frame = legend.get_frame()
frame.set_edgecolor('black')  # 确保边框颜色为黑色
frame.set_linewidth(0.2)  # 设置边框线条的宽度为 0.5

# 设置坐标轴比例和隐藏标签
plt.gca().set_aspect('equal', 'datalim')
plt.tick_params(axis='both', which='both', labelbottom=False, labelleft=False)
# 添加标题
# plt.title('RTE dataset', fontsize=12)
plt.suptitle('RTE dataset', fontsize=12, y=0.02)
plt.savefig('npy/tsne_RTE.png',dpi = 300)
# 显示图形
plt.show()

 

二、HUW数据集绘制tSNE图

2.1 加载数据

from transformers import RobertaTokenizer, RobertaModel
import torch
import numpy as np
import pandas as pd
import random
# 读取TSV文件
df = pd.read_csv("HWU/HWU_train_data.tsv", sep="\t", header=None).dropna() # 替换为您的文件路径
# 随机选择500个句子
# sentences = df.sample(500)[1]  # 句子在第2列
random_samples = df.sample(500)

# 将第2列和第3列的句子拼接起来,两个句子之间用空格分隔
sentences = random_samples[0]

 


15261                      Does Vocelli's do takeaway?
19685      play track one from my david bowie playlist
10380              yeap excellent response to command.
18334                                     that is all.
6228                               that's all, cancel.
                             ...                      
495                           Please remove this alarm
4901                    can you read me news on Trump?
5124                       that is not so clear to me.
10647                 Set my alarm for Tuesday at 6pm.
5639     I am no longer going to Wyatts birthday party
Name: 0, Length: 500, dtype: object

2.2 加载模型保存文件

# 定义model
model = RobertaModel.from_pretrained("./Roberta-large/")     # 加载预训练模型权重
# model.load_state_dict(torch.load('CoLA68.9_best_model_Original.pt'), strict=False) # PLM+softmax微调
# model.load_state_dict(torch.load('CoLA72.9_best_model_calculate_weight_diff.pt'), strict=False) # ours impl

# model.load_state_dict(torch.load('RTE_best_model_original.pt'), strict=False) # PLM+softmax微调
# model.load_state_dict(torch.load('RTE89.3_calculate_weight_diff_model.pt'), strict=False) # ours impl

model.load_state_dict(torch.load('HWU_Original_model.pt'), strict=False) # PLM+softmax微调
# model.load_state_dict(torch.load('HWU_AgDn_model.pt'), strict=False) # ours impl
# model.load_state_dict(torch.load('HWU_wacl_model.pt'), strict=False) # ours impl

tokenizer = RobertaTokenizer.from_pretrained("./Roberta-large/")

# 获取Input Features
input_feature_list = list()

for sentence in sentences:
    inputs = tokenizer(sentence, return_tensors="pt", padding='max_length', truncation=True, max_length=64)
    input_ids = inputs['input_ids']
    attention_mask = inputs['attention_mask']
    input_feature = model(input_ids, attention_mask)[1]
    input_feature_list.append(input_feature.detach().cpu().numpy())

# 堆叠Input Features并保存
orign = np.vstack(input_feature_list)
# np.save('npy/HWU_roberta_FT_500.npy',orign)
np.save('npy/HWU_roberta_PT_500.npy',orign)
# np.save('npy/HWU_roberta_wacl_500.npy',orign)

# For plotting
import matplotlib.pyplot as plt
import seaborn as sns

#For standardising the dat
from sklearn.preprocessing import StandardScaler

#PCA
from sklearn.manifold import TSNE

# roberta_data = np.load('npy/cola_orign_roberta.npy')
roberta_data1 = np.load('npy/HWU_roberta_FT_500.npy')
roberta_data2 = np.load('npy/HWU_roberta_PT_500.npy')
# roberta_data3 = np.load('npy/HWU_roberta_AgDn_500.npy')
roberta_data3 = np.load('npy/HWU_roberta_wacl_500.npy')

# 将所有数据组合在一起以便用t-SNE处理
combined_data = np.vstack([roberta_data1, roberta_data2, roberta_data3])

labels1 = [f'n{i}' for i in range(1, len(roberta_data1) + 1)]
labels2 = [f'n{i}' for i in range(1, len(roberta_data2) + 1)]
labels3 = [f'n{i}' for i in range(1, len(roberta_data3) + 1)]

combined_labels = labels1 + labels2 + labels3

2.3 绘制tSNE图

# 应用t-SNE
tsne = TSNE(n_components=2,       # 将数据降至2维
            random_state=42,      # 设置随机种子以保证结果的可重复性
            perplexity=15,        # 困惑度,影响局部之间的距离,较低的值倾向于将数据点分离为更多的群集
            n_iter=380,           # 迭代次数,影响拟合的优化程度和时间
            early_exaggeration=50)  # 初始嵌入时的过度放大,增加数据点之间的距离,有助于在早期迭代中保留局部结构

tsne_results = tsne.fit_transform(combined_data)

# 设置绘图样式,包括完全去掉边框
sns.set(style='white', context='notebook', rc={'axes.edgecolor': 'none', 'axes.linewidth': 0})

# 创建一个没有边框的画布
plt.figure(figsize=(6, 6), edgecolor='none')  # edgecolor='none' 移除绘图区域的边框

# 为每组数据选择不同的颜色
colors = ['red', 'blue', 'green']

# 第一组数据 plm--红色
plt.scatter(tsne_results[:500, 0], tsne_results[:500, 1], c=colors[0], label='Pre-Training', marker='o', s=5)

# 第二组数据 plm+softmax微调-- 蓝色
plt.scatter(tsne_results[500:1000, 0], tsne_results[500:1000, 1], c=colors[1], label='Fine-Tuning', marker='^', s=5)

# 第三组数据 our impl--绿色
plt.scatter(tsne_results[1000:, 0], tsne_results[1000:, 1], c=colors[2], label='AgDn', marker='s', s=5)

# 自定义图例的边框样式
# legend = plt.legend(fontsize=8, loc='upper left', bbox_to_anchor=(0.0, 1.0), frameon=True, fancybox=True, edgecolor='black')
legend = plt.legend(fontsize=8, loc='upper left',  frameon=True, fancybox=True, edgecolor='black')

# 获取图例的边框对象,并调整边框线条的宽度
frame = legend.get_frame()
frame.set_edgecolor('black')  # 确保边框颜色为黑色
frame.set_linewidth(0.2)  # 设置边框线条的宽度为 0.5

# 设置坐标轴比例和隐藏标签
plt.gca().set_aspect('equal', 'datalim')
plt.tick_params(axis='both', which='both', labelbottom=False, labelleft=False)

# 添加标题
plt.suptitle('HWU dataset', fontsize=15, y=0.02)

# 调整布局以确保保存的图像完整显示
plt.tight_layout()

# 保存图像,使用更高的 DPI 以获得更好的质量
# plt.savefig('npy/tsne_HWU_2.png', dpi=300)

# 显示图形
plt.show()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 指针和数组——指针数组的应用:命令行参数

目录 命令行参数 演示命令行参数与main函数形参间的关系 命令行参数  什么是 命令行参数( Command Line Arguments )?  GUI 界面之前,计算机的操作界面都是字符式的命令行界面 ( DOS 、 UNIX 、 Linux &…

IEPE数据采集卡的作用说明

IEPE指的是一种自带电量放大器或电压放大器的加速度传感器。IEPE是压电集成电路的缩写。因为由加速度传感器产生的电量是很小的,因此传感器产生的电信号很容易受到噪声干扰,需要用灵敏的电子器件对其进行放大和信号调理。IEPE中集成了灵敏的电子器件使其…

连锁行业观察:一线门店设备如何运维?化“管理”为“服务”

连锁零售行业的数字化发展,离开不了大量智能设备的支撑,比如我们日常见到的各种门店互动终端、自助收银设备、无人值守售货机等等。 由于连锁行业的特性,这些设备往往位置分散,数量众多,难以集中管理。一旦这些设备遇…

ARM功耗管理之多核处理器启动

安全之安全(security)博客目录导读 思考:SecureBoot?多核处理器启动流程?PSCI启动方式? 一般嵌入式系统使用的都是对称多处理器(Symmetric Multi-Processor, SMP)系统,包含了多个cpu, 这几个cp…

YOLOv8改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…

从零开始开发视频美颜SDK:实现直播美颜效果

因此,开发一款从零开始的视频美颜SDK,不仅可以节省成本,还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前,首先需要进行详细的需求…

MongoDB本地配置分片

mongodb server version: 7.0.12 社区版 mongo shell version: 2.2.10 平台:win10 64位 控制台:Git Bash 分片相关节点结构示意图 大概步骤 1. 配置 配置服务器 副本集 (最少3个节点) -- 创建数据目录 mkdir -p ~/dbs/confi…

硬件开发工具Arduino IDE

招聘信息共享社群 关联上篇文章乐鑫ESPRESSIF芯片开发简介 Arduino IDE(集成开发环境)是为Arduino硬件开发而设计的一款软件,它提供了一个易于使用的图形界面,允许用户编写、编辑、编译和上传代码到Arduino开发板。Arduino IDE的…

【逆向基础】十、逆向工具分享之DIE(Detect It Easy)

一、简介 DIE(Detect It Easy)是一款可以轻松检测PE文件的程序;其主要作用是查壳,并将pe文件的内容解析出来,包括PE文件中包含的导入函数、导出函数的名称及地址,入口函数地址等,是技术人员分析…

mysql高并发设计

mysql高并发设计 一、部署方案 https://blog.csdn.net/weixin_37519752/article/details/138728036 方案1:双主 1、优点 写入扩展性:两个节点都可以处理写入操作,提高了写入操作的扩展性。 高可用性:在任一节点故障时&#xff…

【Linux】静态库的制作和使用详解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

【Spring Boot】Spring原理:Bean的作用域和生命周期

目录 Spring原理一. 知识回顾1.1 回顾Spring IOC1.2 回顾Spring DI1.3 回顾如何获取对象 二. Bean的作用域三. Bean的生命周期 Spring原理 一. 知识回顾 在之前IOC/DI的学习中我们也用到了Bean对象,现在先来回顾一下IOC/DI的知识吧! 首先Spring IOC&am…

权利之望账号注册教程 权力之望游戏客户端下载教程

权力之望,一款马上就要上线的新的MMORPG游戏,非常好玩大型多人在竞技的游戏,玩家在游戏中有着60多种不同的职业可以选择,而且整个游戏的画面非常精美,更有各种不同的武器装备可以选择,热血的战斗和各种大型…

c语言的简易教法—— 函数递归

文章目录 一、什么是递归?1.1递归的思想1.2递归的限制条件 二、递归案例2.1 案例1:求n的阶层2.1.1分析2.1.2 递归函数(Fact)的代码实现2.1.3 测试:main函数实现2.1.4 运行结果和画图推演2.1.5 扩展:迭代方法…

配置Java开发环境

Java是一种广泛使用的编程语言,特别是在企业应用和安卓开发中。本文将详细介绍如何在您的计算机上配置Java开发环境,包括安装JDK、配置环境变量以及选择和设置IDE。 一、安装Java Development Kit (JDK) JDK(Java Development Kit&#xff0…

IDEA阿里云OSS实现文件上传·解决苍穹外卖图片回显

简单交代配置阿里云OSS的思路 1. 首先去阿里云开通一个OSS服务,配置好一个自己的Bucket 2. 在IDEA配置Bucket 3. 拷贝官网的OSS工具类代码 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSS…

Redis 配置与优化

一、关系型数据库与非关系型数据库 (一)关系型数据库 关系型数据库是结构化数据库,创建在关系型模型数据库,创建面向于记录。 常见的关系型数据库:Oracle、MySQL、SQL Server、Microsoft Access、DB2。 &#xf…

2024年浙江省高考分数一分一段数据可视化

下图根据 2024 年浙江高考一分一段表绘制,可以看到,竞争最激烈的分数区间在620分到480分之间。 不过,浙江是考两次取最大,不是很有代表性。看看湖北的数据,580分到400分的区段都很卷。另外,从这个图也可以…

【vue】下载 打印 pdf (问题总结)- 持续更新ing

这里是目录标题 一、pdf1.查看 下载一、pdf 1.查看 下载 样式 Code<template><div><el-table :data="pdfList" style="width: 100%" border ><el-table-columnprop="index"label="序号"width="80"ali…

告别低效地推!Xinstall助力,一键生成专属渠道二维码

在移动互联网时代&#xff0c;地推作为一种传统而有效的推广方式&#xff0c;依然被众多企业所青睐。然而&#xff0c;传统的地推方式往往伴随着繁琐的填码、人工登记以及难以追踪的下载来源等问题&#xff0c;极大地降低了推广效率。为了解决这些痛点&#xff0c;Xinstall应运…