统计图中节点特征的余弦相似度、欧式距离

article/2025/6/8 19:30:18

把有关系节点的余弦相似度保存在一块,再把没有关系节点的余弦相似度保存在一块,最后绘图

程序:

#zhouzhichao
#25年5月29日
#统计图中节点的余弦相似度import h5py
import random
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity, euclidean_distancessnr = 0
# mode = "cosine"
mode = "euclidean"base_dir = "D:\\无线通信网络认知\\论文1\\experiment\\直推式拓扑推理实验\\拓扑生成\\200样本"data_dir = base_dir+'\\30_nodes_dataset_snr-'+str(snr)+'_M_3000.mat'# 加载.mat文件
mat_file = h5py.File(data_dir, 'r')
# 获取数据集
Signals = mat_file["Signals"][()]
Tp = mat_file["Tp"][()]
Tp_list = mat_file["Tp_list"][()]
# 关闭文件
mat_file.close()# 初始化空列表
list_1 = []
list_0 = []# 2. 基于阈值相似性图的方法
def similarity_threshold_method(signals, tp):# 计算余弦相似度# 统计有关系的节点和没关系的节点余弦相似度signals = np.swapaxes(signals,0,1)if mode=="cosine":similarity = cosine_similarity(signals)if mode == "euclidean":similarity = euclidean_distances(signals)N = tp.shape[0]# 根据阈值判断节点关系for i in range(N):for j in range(N):if tp[i, j] == 1:list_1.append(similarity[i][j])else:list_0.append(similarity[i][j])for k in range(200):print("k: ",k)# 获取当前样本的信号和tp矩阵signal = Signals[:, :, k]  # (1890, 30) - 对应当前样本的信号矩阵tp = Tp[:, :, k]  # (30, 30) - 对应当前样本的tp矩阵similarity_threshold_method(signal, tp)minlength = min(len(list_1),len(list_0))# list_0 = random.sample(list_0, minlength)list_1 = random.sample(list_1, 1000)
list_0 = random.sample(list_0, 1000)# data = {
#     'list_1': list_1,
#     'list_0': list_0
# }value = list_1 + list_0
large_class = list(np.full(len(value), snr))
small_class = list(np.full(len(list_1), 1)) + list(np.full(len(list_0), 0))# data = {
#     'list_1': list_1,
#     'list_0': list_0
# }data = {'large_class': large_class,'small_class': small_class,'value': value
}# 创建一个 DataFrame
df = pd.DataFrame(data)
#
# # 保存到 Excel 文件
file_path = 'D:\无线通信网络认知\论文1\大修意见\图聚类、阈值相似性图实验补充\\'+mode+'_similarity_'+str(snr)+'db.xlsx'
df.to_excel(file_path, index=False)

求余弦值的话

mode = "cosine"

求欧式距离的话

mode = "euclidean"

输入:

输出:

保存成这种形式是方便Origin绘图,第一列是大类,第二列是小类

绘图效果:

还有一种更高级的统计方式,就是不直接对原始图节点特征进行统计,而是表示学习后在高维空间进行统计,例如图卷积神经网络GCN

高维图节点特征统计程序:

#作者:zhouzhichao
#创建时间:25年5月29日
#内容:统计图中有关系节点和无关系节点的GCN特征欧式距离import sys
import torch
import random
import numpy as np
import pandas as pd
from torch_geometric.nn import GCNConv
from sklearn.metrics import roc_auc_score
sys.path.append('D:\无线通信网络认知\论文1\experiment\直推式拓扑推理实验\GCN推理')
from gcn_dataset import graph_data
print(torch.__version__)
print(torch.cuda.is_available())mode = "gcn"class Net(torch.nn.Module):def __init__(self):super().__init__()self.conv1 = GCNConv(Input_L, 1000)self.conv2 = GCNConv(1000, 20)# self.conv3 = GCNConv(2000, 256)# self.conv4 = GCNConv(256, 128)def encode(self, x, edge_index):x1 = self.conv1(x, edge_index)x1_1 = x1.relu()x2 = self.conv2(x1_1, edge_index)x2_2 = x2.relu()# x = self.conv3(x, edge_index).relu()# x = self.conv4(x, edge_index).relu()return x2_2def decode(self, z, edge_label_index):# 节点和边都是矩阵,不同的计算方法致使:节点->节点,节点->边# nodes_relation = (z[edge_label_index[0]] * z[edge_label_index[1]]).sum(dim=-1)# distances  = torch.norm(z[edge_label_index[0]] - z[edge_label_index[1]], dim=-1)distance_squared = torch.sum((z[edge_label_index[0]] - z[edge_label_index[1]]) ** 2, dim=-1)# print("distance_squared: ",distance_squared)return distance_squareddef decode_all(self, z):prob_adj = z @ z.t()  # 得到所有边概率矩阵return (prob_adj > 0).nonzero(as_tuple=False).t()  # 返回概率大于0的边,以edge_index的形式@torch.no_grad()def test(self,input_data):model.eval()z = model.encode(input_data.x, input_data.edge_index)out = model.decode(z, input_data.edge_label_index).view(-1)out = 1 - outN = 30
train_n = 31
M = 3000
# snr = -20
# for train_n in range(1,51):
# for M in range(3000, 499, -100):
for snr in [0,20,40]:# M = 10000# print("train_n: ", train_n)# gcn_data = graph_data("gcn_data")# print("M: ", M)print("snr: ", snr)for I in range(10):root = "gcn_data-"+str(I)+"_N_"+str(N)+"_snr_"+str(snr)+"_train_n_"+str(train_n)+"_M_"+str(M)gcn_data = graph_data(root)Input_L = gcn_data.x.shape[1]model = Net()# model = Net().to(device)optimizer = torch.optim.Adam(params=model.parameters(), lr=0.01)criterion = torch.nn.BCEWithLogitsLoss()def train():model.train()optimizer.zero_grad()z = model.encode(gcn_data.x, gcn_data.edge_index)# out = model.decode(z, train_data.edge_label_index).view(-1).sigmoid()out = model.decode(z, gcn_data.edge_label_index).view(-1)out = 1 - outloss = criterion(out, gcn_data.edge_label)loss.backward()optimizer.step()return lossmin_loss = 99999count = 0#早停for epoch in range(10000):loss = train()if loss<min_loss:min_loss = losscount = 0count = count + 1if count>100:breakprint("epoch:  ",epoch,"   loss: ",round(loss.item(),2), "   min_loss: ",round(min_loss.item(),2))z = model.encode(gcn_data.x, gcn_data.edge_index)out = model.decode(z, gcn_data.edge_label_index).view(-1)list_0 = []list_1 = []for i in range(len(gcn_data.edge_label)):true_label = gcn_data.edge_label[i].item()euclidean_distance_value = out[i].item()if true_label==1:list_1.append(euclidean_distance_value)if true_label==0:list_0.append(euclidean_distance_value)minlength = min(len(list_1), len(list_0))list_1 = random.sample(list_1, minlength)list_0 = random.sample(list_0, minlength)value = list_1 + list_0large_class = list(np.full(len(value), snr))small_class = list(np.full(len(list_1), 1)) + list(np.full(len(list_0), 0))data = {'large_class': large_class,'small_class': small_class,'value': value}# 创建一个 DataFramedf = pd.DataFrame(data)## # 保存到 Excel 文件file_path = 'D:\无线通信网络认知\论文1\大修意见\图聚类、阈值相似性图实验补充\\' + mode + '_similarity_' + str(snr) + 'db_'+str(I)+'.xlsx'df.to_excel(file_path, index=False)

保存结果:

重点在这:

z = model.encode(gcn_data.x, gcn_data.edge_index)
out = model.decode(z, gcn_data.edge_label_index).view(-1)list_0 = []
list_1 = []for i in range(len(gcn_data.edge_label)):true_label = gcn_data.edge_label[i].item()euclidean_distance_value = out[i].item()if true_label==1:list_1.append(euclidean_distance_value)if true_label==0:list_0.append(euclidean_distance_value)

画出来后长这个样子,可以看出表示学习后,有关系和没关系的节点之间的特征距离区分度更明显了 


http://www.hkcw.cn/article/PVrFaxRSDe.shtml

相关文章

小沈阳演唱会嘉宾是女儿 同台献唱温馨互动

舞台灯光在夜空中划出几道银白的弧线,沈阳奥体中心的欢呼声浪一阵高过一阵。小沈阳穿着标志性的格子衬衫,手里的麦克风还没凑近唇边,台下就爆发出此起彼伏的“阳仔——”呼喊。他笑着转了个圈,眼角余光不经意扫向后台侧幕——那里站着个扎着高马尾的姑娘,藏蓝色牛仔外套下…

小米王化疑回怼余承东 暗讽友商根底浅

6月1日,小米的王化发文提到,到2025年5月,小米汽车的交付量将超过28000台。他还表示,公司正在为小米YU7的大规模量产做准备,并感谢了大家的支持与青睐。他引用了一句名言:墙上芦苇,头重脚轻根底浅;山间竹笋,嘴尖皮厚腹中空。责任编辑:zx0001

处理链--条件判断

在同一条链里&#xff0c;根据条件判断下一步到底执行不执行。那就得用到下面这个条件判断的process。这个就负责条件分支执行&#xff0c;在处理链运行时按逻辑结果来把处理链分成不同的分支执行。 很简单&#xff0c;先把它拖到处理链里。 然后就可以来定义条件。条件的定义决…

c++5月31日笔记

题目&#xff1a;水龙头 时间限制&#xff1a;C/C 语言 1000MS&#xff1b;其他语言 3000MS 内存限制&#xff1a;C/C 语言 65536KB&#xff1b;其他语言 589824KB 题目描述&#xff1a; 小明在 0 时刻&#xff08;初始时刻&#xff09;将一个空桶放置在漏水的水龙头下。已知桶…

乒协支持樊振东加盟德甲 征战德甲与欧冠

6月1日,德甲萨尔布吕肯俱乐部宣布中国运动员樊振东加盟,他将参加2025-2026赛季的德国乒乓球甲级联赛和欧洲冠军联赛。目前樊振东仍处于奥运后的调整期,计划通过全国比赛及国内外俱乐部比赛逐步恢复状态。中国乒协对此表示理解和支持,将全力保障樊振东保持良好竞技水平,为乒…

罗翔现场普法 沃尔沃全新S90上市 北欧豪华领航而至

2025年5月29日,沃尔沃全新S90在大庆工厂正式上市。新车共推出7个配置版本,限时参考尊享价30.09万元起,并提供价值超过85,000元的八重惊喜礼。沃尔沃全新S90致力于为全球有品位、追求品质的精英人群带来进阶焕新的豪华体验。沃尔沃汽车品牌挚友罗翔出席发布会,以法律专家的角…

向佐六一晒女儿 网友:幸好颜值随妈 父女温馨互动登热搜

2025年6月1日中午12点左右,向佐在个人微博上首次公开了4岁女儿向芷(乳名“小奶皇”)的正脸照片及互动视频。这位一向注重孩子隐私保护的父亲,在儿童节这个特殊日子与网友分享了父女间的温馨时刻,迅速登上热搜榜首。视频中,小奶皇认真地为爸爸做面部按摩,肉嘟嘟的小手在向…

JS和TS的区别

JavaScript 与 TypeScript 的主要区别和特性对比 1. 基础定义 JavaScript 是一种动态、弱类型的编程语言&#xff0c;广泛应用于前端开发以及通过 Node.js 扩展到后端开发。TypeScript 则是 JavaScript 的超集&#xff0c;它在 JavaScript 的基础上添加了静态类型系统和其他增…

淘晶驰串口屏开发初体验:10分钟实现简易加法器

目录 一、开发环境闪电搭建&#xff08;3分钟&#xff09; 二、加法计算器实现步骤&#xff08;7分钟&#xff09; 1.工程创建 2.创建字库和导入字库 3. 拖放控件-文本控件 4.拖放控件-数字控件 5.&#xff08;x&#xff09;变量 6.按钮 三、测试 在嵌入式设备的人机交…

CppCon 2014 学习:Parallelizing the Standard Algorithms Library

Bringing Parallelism to C&#xff08;为 C 引入并行性&#xff09; 技术规范&#xff08;Technical Specification&#xff09; 是对 C 标准库的一个扩展草案&#xff08;TS Technical Specification&#xff09;。不会改变现有代码语义&#xff0c;而是提供新功能。专门针…

俄罗斯一桥梁坍塌致3死28伤 爆炸装置所致

俄罗斯布良斯克州一座桥梁发生坍塌,导致一列由莫斯科开往该州城市克利莫沃的火车脱轨。据俄罗斯紧急情况部初步统计,事故共造成31人伤亡,其中3人不幸遇难,28人已送往医疗机构救治。此前有报道指出,事件造成4人死亡,至少44人受伤。俄紧急情况部表示,救援人员正在对受损车…

任务调度器:从入门到放弃(二)

理想与现实的差异 在上文中&#xff0c;我们提到&#xff0c;一个优先级100的线程&#xff0c;跟一个优先级为120的线程进行公平调度的资源抢占的话。 从抓取的一份systrace上简单的对比来看&#xff0c; 其份额大概是24:1856 &#xff08;systrace上随便框的&#xff0c;数据…

linux 1.0.6

PMS和软件安装的介绍 软件安装不能放在前面 你连linux自带的命令都整不会&#xff0c;你还去使用人家自己写的软件 整一个类似于手机商城的概念&#xff0c;直接进商城就可以下载软件 package management system 也就是PMS 叫做包管理器&#xff0c;作用是用来进行软件的安装&…

3D Gaussian splatting 02: 快速评估

目录 3D Gaussian splatting 01: 环境搭建3D Gaussian splatting 02: 快速评估3D Gaussian splatting 03: 用户数据训练和结果查看3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云3D Gaussian splatting 05: 代码阅读-训练整体流程3D Gaussian splatting 06: 代码阅…

【系统配置与部署类】linux系统下的desktop图标文件配置

相关文章已经在个人博客网站上更新&#xff0c;欢迎访问&#xff1a; linux系统下的desktop图标文件配置http://www.turnin-blog.online/articles/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE%E4%B8%8E%E9%83%A8%E7%BD%B2/linux%E7%B3%BB%E7%BB%9F%E4%B8%8B%E7%9A%84desktop%E5%9B%…

法国为何此时回应阵风是否被击落 服役20年首损?

法国军方首次回应“阵风”战机疑被击落事件,称如果消息属实,这将是该机服役以来首次在实战中损毁。印度空军引进了这款战斗机。5月27日,在例行记者会上,法国国防部军方发言人强调,若相关信息属实,这将是“阵风”战斗机服役20年来首次在实战中损毁。这也是法国军方就这一话…

从零开始的二三维CAD|CAE软件: 解决VTK,DICOM体素化-失效问题.

背景: 在从零开始的二三维软件开发中, 需要加载CT的dicoms影像文件, 并将其序列化之后的数据,体素化 可惜..vtk的c#库,将其体素化的时候,竟然失败... 使用vtkDicomReader ,设置 Dicom文件夹读取,竟然不停的失败...从网上找了一些版本.也没啥可用的资料... 解决办法: 直接…

Cesium快速入门到精通系列教程一

一、打造第一个Cesium应用 1、官方渠道下载Cesium&#xff08;可选择历史版本&#xff09; ​​GitHub Releases页面​​ 访问 Cesium GitHub Releases&#xff0c;此处列出了所有正式发布的版本。 通过标签&#xff08;如 v1.95.0&#xff09;选择目标版本&#xff0c;下载…

【多线程初阶】synchronized -监视器锁monitor lock

文章目录 &#x1f305;synchronized关键字&#x1f30a; synchronized 的互斥&#x1f30a; synchronized 的变种写法&#x1f3c4;‍♂️synchronized 修饰代码块 :明确指定锁哪个对象&#x1f3c4;‍♂️synchronized 修饰方法 &#x1f30a; synchronized 的可重入性&#…

C# 面向对象特性

面向对象编程的三大基本特性是&#xff1a;封装、继承和多态。下面将详细介绍这三大特性在C#中的体现方式。 封装 定义&#xff1a;把对象的数据和操作代码组合在同一个结构中&#xff0c;这就是对象的封装性。 体现方式&#xff1a; 使用访问修饰符控制成员的可见性 通过属…