当前位置: 首页 > article >正文

【图论】计算图的n-hop邻居个数,并绘制频率分布直方图

计算图的n-hop邻居个数,并绘制频率分布直方图

在图论中,n-hop邻居(或称为K-hop邻居)是指从某个顶点出发,通过最短路径(即最少的边数)可以到达的所有顶点的集合,其中n(或K)是这个最短路径的长度。换句话说,n-hop邻居就是在图中,从一个顶点出发,经过n步可以到达的所有顶点。

举个日常生活中的例子,我们的朋友是我们的1-hop邻居,我们的朋友的朋友是我们的2-hop邻居,以此类推。如果我们想找到所有与我们最多只有三层朋友关系的人(包括我们的朋友、我们的朋友的朋友、以及我们的朋友的朋友的朋友),那么这些人就是我们的3-hop邻居。

在下图中对于中间的红色节点,玫红色的就是1-hop邻居,橙色2,粉色3。

Gaudelet, T. et al. Utilizing graph machine learning within drug discovery and development. doi:10.1093/bib/bbab159.

如何在networkx中计算n-hop邻居的数量?

由定义我们可以知道,只要找到某个节点通过最短路径为n的边就可以找到它的n-hop邻居了,那么我们就可以用nx.single_source_shortest_path_length

代码如下:

import networkx as nx
def n_hop_neighbors(G, n_hop):
    """
    Calculate n-hop neighbors for each node in the graph.
    """
    n_hop_counts = {}
    for node in G.nodes():
        # n_hop_counts[node] = len(list(nx.single_source_shortest_path_length(G, node, cutoff=n_hop))) - 1
        n_hop_counts[node] = len(list(nx.single_source_shortest_path_length(G, node, cutoff=n_hop).keys())) - 1
        
    n_hop_array = list(n_hop_counts.values())
    return n_hop_array

绘制分布直方图

我们使用seaborn的sns.histplot来进行绘制,代码如下:

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Assuming G is your NetworkX graph
# Example graph
# G = nx.Graph()
# G.add_edges_from([('v1', 'v2'), ('v2', 'v4'), ('v1', 'v3')])
plt.figure(figsize=(6, 3))

# Calculate n-hop neighbors for n=1
# n_hop_counts = n_hop_neighbors(G, 3)
# Step 1: Store n-hop counts in a dictionary
n_hop_counts_dict = {}
for i in range(1, 5): # Hop counts 1 through 4
    n_hop_counts_dict[f'{i}-hop'] = n_hop_neighbors(G, i)

# Step 2: Convert the dictionary to a DataFrame
n_hop_counts_df = pd.DataFrame(n_hop_counts_dict)

# Reshape the DataFrame to long format
n_hop_counts_long = n_hop_counts_df.melt(var_name='n-hop', value_name='Number of cells in n-hop neighbourhood')
# Plotting the histogram
sns.histplot(data=n_hop_counts_long, x="Number of cells in n-hop neighbourhood", hue="n-hop", kde=False, log_scale=False, stat="probability")
plt.xlim(0, 110)
plt.grid(False)
plt.show()

结果如下:

image-20240314161010809


http://www.kler.cn/a/271915.html

相关文章:

  • 抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
  • C语言常用知识结构深入学习
  • 2025最新 Docker 国内可用镜像源仓库地址(01月02日更新)
  • 安卓动态设置Unity图形API
  • 【Knife4j与Swagger的区别是什么?】
  • 实战演示:利用ChatGPT高效撰写论文
  • Linux磁盘分区————逻辑卷
  • Java8 新特性
  • Ubuntu 20.04 系统如何优雅地安装NCL?
  • 【Linux】基础 IO(文件描述符)-- 详解
  • 代码随想录算法训练营第二十四天|216.组合总和III、17.电话号码的字母组合
  • ELK之使用Filebeat插件收集日志到Logstash
  • 算法思想总结:滑动窗口算法
  • 飞桨科学计算套件PaddleScience
  • [NCNN学习笔记]-1
  • 手机网络连接性能API接口:查询手机网络连接性能状态
  • 后端程序员入门react笔记(八)-redux的使用和项目搭建
  • 阿里云免费证书改为3个月,应对方法很简单
  • Jmeter——循环控制器中实现Counter计数器的次数重置
  • windows 免密码ssh登录linux;linux免密码ssh登录其他linux
  • 在根据卷积核大小计算padding时要遵循什么原则
  • MySQL语法分类 DQL(3)排序查询
  • ARM 汇编指令:(六) B 跳转指令
  • Java12~14 switch语法
  • QT文件的读取与插入
  • 【Linux】进程与可执行程序的关系fork创建子进程写实拷贝的理解