Python 实现简单的超图 Hypergraph

我是“导航”

  • 1 超图
  • 2 代码
  • 3 说明
  • 4 参考


1 超图

在数学中,超图(Hypergraph)是一种广义上的图,是有限集合中最一般的离散结构,在信息科学、生命科学等领域有着广泛的应用。(如果有疑问,可以参看我写的另外一篇超图基础知识的博客。)
边(edge)顶点(vertex 或 node) 组成。
超图超边(hyperedge)顶点(vertex) 组成。

类型元素
顶点 + 边
超图顶点 + 超边

普通图,一条边只能连接两个顶点,而超图的一条边可以连接任意数量的顶点。
记超图为 G G G,顶点集合为 V \mathcal{V} V,超边集合为 E \mathcal{E} E,则有
G = ( V , E ) G = (\mathcal{V}, \mathcal{E}) G=(V,E)
如果是加权超图,则:
G = ( V , E , W ) G = (\mathcal{V}, \mathcal{E}, W) G=(V,E,W)
其中 W W W 表示权重。

对于顶点集合 V \mathcal{V} V 中的任意顶点 v v v,可以表示为 v ∈ V v \in \mathcal{V} vV
对于超边集合 E \mathcal{E} E 中的任意超边 e e e,可以表示为 e ∈ E e \in \mathcal{E} eE,且 e ⊂ V e \subset V eV

2 代码

顶点 v v v 应该包含一些属性:

  • 名称 —— 顶点得有一个专属编码吧,不与其他顶点重复,用于区分不同的顶点;
  • 权重 —— 顶点的权重,这个可有可无,看你的实际需求。
变量:类型含义符号
Vertex: class顶点 v v v
name: str (int)顶点名称
weight: float顶点权重 w ( v ) w(v) w(v)

那么确定好顶点的属性之后,就可以定义顶点类了。

class Vertex:def __init__(self, name: str = None, weight: float = None):self.name = nameself.weight = weight

超边 e e e 应该包含一些属性:

  • 名称 —— 超边得有一个专属编码吧,不与其他超边重复,用于区分不同的超边;
  • 顶点集 —— 超边是由特定的顶点集组成的,那么得保存该超边包含的顶点集;
  • 权重 —— 超边的权重,这个可有可无,看你的实际需求。
变量:类型含义符号
Edge: class超边 e e e
name: str (int)超边名称
vertices: List [Vertex]超边包含的顶点集 ⋃ v ∈ e v \bigcup_{v \in e} v vev
weight: float超边权重 w ( e ) w(e) w(e)

那么确定好超边的属性之后,就可以定义超边类了。

from typing import List
import Vertexclass Edge:def __init__(self, name: str = None, weight: float = None, vertices: List[Vertex] = None):self.name = nameself.weight = weightself.vertices = vertices

超图 G G G 是由顶点集 V V V 和超边集 E E E 组成的。那么定义 G G G 只需要将 V V V E E E 的定义组装起来就可以啦。

超图 G G G 应该包含一些属性:

  • 顶点集 —— 对应 V V V
  • 超边集 —— 对应 E E E
  • 关联矩阵 —— 这个可有可无,看你的实际需求;
  • 顶点度 —— 这个可有可无,看你的实际需求;
  • 超边度 —— 这个可有可无,看你的实际需求;
  • 顶点度矩阵 —— 这个可有可无,看你的实际需求;
  • 超边度矩阵 —— 这个可有可无,看你的实际需求;
变量:类型含义符号
Hypergraph: class超图 G G G
vertices: List [Vertex]顶点集 V V V
edges: List [Edge]超边集 E E E
num_vertices: int顶点的数量 ∣ V ∣ \lvert V \rvert V
num_edges: int超边的数量 ∣ E ∣ \lvert E \rvert E
incident_matrix: np.ndarray关联矩阵 H H H
vertices_degree: np.ndarray所有顶点的度 d d d
edges_degree: np.ndarray所有超边的度 δ \delta δ
vertex_degree_diagonal_matrix: np.ndarray顶点度组成的对角矩阵 D v D_v Dv
edge_degree_diagonal_matrix: np.ndarray超边度组成的对角矩阵 D e D_e De

超图类定义:

from typing import List
import numpy as npimport Edge
import Vertexclass Hypergraph(object):def __init__(self, vertices: List[Vertex] = None, edges: List[Edge] = None):self.vertices = verticesself.edges = edgesif vertices is None or edges is None:self.num_vertices = 0self.num_edges = 0self.incident_matrix = Noneself.vertices_degree = Noneself.edges_degree = Noneself.vertex_degree_diagonal_matrix = Noneself.edge_degree_diagonal_matrix = Noneelse:self.num_vertices = len(vertices)self.num_edges = len(edges)self.incident_matrix = self.calculate_incident_matrix()self.vertices_degree = self.calculate_vertex_degree()self.edges_degree = self.calculate_edge_degree()self.vertex_degree_diagonal_matrix = self.calculate_diagonal_matrix_of_vertex_degree()self.edge_degree_diagonal_matrix = self.calculate_diagonal_matrix_of_edge_degree()def init_hypergraph_from_files(self, dataset_dir: str):self.vertices, self.edges = hypergraph_construction(dataset_dir)self.num_vertices = len(self.vertices)self.num_edges = len(self.edges)self.incident_matrix = self.calculate_incident_matrix()self.vertices_degree = self.calculate_vertex_degree()self.edges_degree = self.calculate_edge_degree()self.vertex_degree_diagonal_matrix = self.calculate_diagonal_matrix_of_vertex_degree()self.edge_degree_diagonal_matrix = self.calculate_diagonal_matrix_of_edge_degree()def calculate_incident_matrix(self):"""Calculate the incident matrix of the hypergraph.:return: The incident matrix of the hypergraph."""incident_matrix = np.zeros(shape=(self.num_vertices, self.num_edges), dtype=int)for i in range(self.num_vertices):vertex = self.vertices[i]for j in range(self.num_edges):edge = self.edges[j]if vertex in edge.vertices:incident_matrix[i, j] = 1return incident_matrixdef calculate_vertex_degree(self):"""Calculate the degree of vertices in the hypergraph.:return: The degree of vertices in the hypergraph."""edge_weights = np.zeros(shape=(self.num_edges,), dtype=np.float64)for i in range(self.num_edges):edge = self.edges[i]edge_weights[i] = edge.weightedge_weights = edge_weights.reshape(-1, 1)vertex_degree_array = np.dot(self.incident_matrix, edge_weights)return vertex_degree_array.reshape(vertex_degree_array.size, )def calculate_edge_degree(self):"""Calculate the degree of edges in the hypergraph.:return: The degree of edges in the hypergraph."""edges_degree = self.incident_matrix.sum(axis=0)return edges_degreedef calculate_diagonal_matrix_of_vertex_degree(self):"""Create a diagonal matrix with the degrees of vertex as the diagonal elements.:return: The diagonal matrix."""return np.diag(self.vertices_degree)def calculate_diagonal_matrix_of_edge_degree(self):"""Create a diagonal matrix with the degrees of edge as the diagonal elements.:return: The diagonal matrix."""return np.diag(self.edges_degree)

3 说明

以上代码注重 “低耦合、高内聚” 的设计理念。在实际中,为了简略和便捷,往往会简化以上代码。请根据需要设计代码。

4 参考

  1. 超图(Hypergraph)基础——论文细品——《Learning with hypergraphs: Clustering, classification, and embedding》
  2. 集智百科

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于WPF技术的换热站智能监控系统15--实时读取PLC数据

1、创建PLC实时数据 1、添加数据块 2、创建6个变量 用来表示水泵1和水泵2的参数,可以根据现场实际情况添加更多的变量参数 3、设置块属性并编译 4、下载该程序到PLC中 5、添加监控表 2、读取设备数据 S7协议下的tcp直接通讯,配置简单,一般P…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

JMU 数科 数据库与数据仓库期末总结(3)简答题

什么是存储过程及其优缺点 存储过程是由过程化SQL语句书写的过程,这个过程经过编译和优化后存储在数据库服务器中,使用时调用即可。优点:运行效率高;降低了客户与服务器之间的通信量。 缺点:开发和调试较复杂 什么叫…

10KM无人机高清图传通信模组,低延迟、抗干扰,飞睿智能无线MESH组网模块

随着科技的飞速发展,无人机技术在各个领域的应用越来越广泛。尤其在海上监测、搜索救援、货物运输等场景中,无人机的应用显得尤为重要。然而,要实现无人机在复杂海域环境中的高效通信,高清图传通信模组的作用不可忽视。本文将深入…

【笔记】复制Edge的网址粘贴后自动变成中文标题超链接

问题 1、从edge复制的网址粘贴直接显示网页内容名称而不是网址url。 2、复制任何网址粘贴到CSDN里面粘贴时直接转换成标题超链接(很讨厌的功能习惯)。 而如上两种问题不是互相影响的,就算设置了Edge的粘贴方式,复制到CSDN的文章…

来自红队大佬的经验之谈---命令执行过滤绕过-Windows篇

感谢来自老流氓大佬的投稿,本次文章介绍的是在windows环境下,过滤的“点”和“空格”等符号,导致在写入webshell时会受限。以下是针对该目标的绕过记录。 首先是命令执行和过滤验证,如下:​ 执行dir命令,…

基于JSP的二手车交易网站

开头语: 你好呀,我是计算机学长猫哥!如果你对二手车交易网站感兴趣或有相关开发需求,欢迎随时联系我。我的联系方式可以在文末找到。 开发语言:Java 数据库:MySQL 技术:JSPJava 工具&#…

微服务开发与实战Day10 - Redis面试篇

一、Redis主从集群 1. 搭建主从集群 1.1 主从集群结构 单节点Redis的并发能力是有限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 如图所示,集群中有一个master节点、两个slave节点(现在叫re…

机械师电脑文件丢失怎么办?6个恢复方法,希望能帮到您

机械师电脑作为高性能的计算机品牌,受到众多用户的青睐。然而,即便是品质卓越的电脑,也难免会遇到文件丢失的困扰。无论是由于误操作、系统故障还是硬盘损坏,文件丢失都可能给用户带来不小的麻烦。当您发现机械师电脑上的文件突然…

海洋经济捧出一个IPO,宁波海上鲜数字化赋能背后的喜与忧

近日,宁波海上鲜信息技术股份有限公司(下称“海上鲜”)向港交所递交上市申请,国泰君安国际、东兴证券(香港)为其联席保荐人。贝多财经获悉,该公司自2022年5月起便开始筹备赴港上市,但…

new和malloc区别:

1、malloc和free是C/C语言的标准库函数,new和delete是C中的运算符。都可以用于申请动态内存和释放内存。 2、对于非内部数据类型的对象而言,光使用malloc函数和free函数是无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在…

怎么把两个音频合成一个?将两个音频合成一个的四种方法

怎么把两个音频合成一个?在当今数字化的时代,音频处理已经成为我们生活中不可或缺的一部分。有时候,我们会希望将两段音频合成为一个,无论是为了制作音乐混音、创作声音效果,还是为了编辑播客节目或视频配音。合成音频…

Java18新特性(极简)

一、引言 自1995年Java语言首次亮相以来,它已经成为企业级应用、移动应用和游戏开发等领域不可或缺的一部分。随着技术的不断进步,Java也在持续演化,每个新版本都带来了诸多新特性和性能优化,旨在提升开发者的编程效率和应用程序的…

Mac环境如何使用Flutter Version Manager (fvm)

Mac环境如何使用Flutter Version Manager (fvm) Flutter Version Manager (fvm) 是一个 Flutter 版本管理工具,它允许开发者在本地安装并管理多个 Flutter 版本。使用 fvm,您可以轻松切换不同版本的 Flutter SDK,进行多项目开发而无需重复安…

怎么把网页上的接口信息导入postman

第一步 打开f12,右键选中需要的接口。选择copy-copy as cURL 第二步 打开postman,选择"Raw Text", 把刚才复制的curl粘贴到空白位置,点击Continue - 最后的效果。导入的接口自带cookie,不用再输入cookie&a…

java如何截取字符串

如果想在一个字符串中截取一段字符,形成新的字符,那么在java中途需要用到substring语句 substring的语法格式是 str.substring(beginindex,endindex) 其中str是字符串 beginindex是起始索引,endindex是结束索引 截取的字符串包含起始索引…

vulnhub靶机hacksudoLPE中Challenge-2

二、Challenge-2 1. ar Abusing 这个是要利用suid注意sudo也可以用,但是还是按照要求来 注意使用的suid自然是home文件夹 2. ash abusing 33. atobm Abusing 环境有问题,做不了 34. base32 Abusing 35. bash Abusing 36. cat Abusing 37. chmod Abusin…

警惕!ELSEVIER旗下1本双1区TOP被On Hold !请大家谨慎投稿

【SciencePub学术】又1本!双1区TOP刊被On Hold !官方现在对期刊质量的管控越来越严格了,被标记为On Hold后的期刊中,大部分的命运也是被WOS数据库剔除!所以请大家谨慎投稿! 《Information Sciences》作为一…

antd vue 输入框基础案例

11 Input 输入框 通过鼠标或键盘输入内容&#xff0c;是最基础的表单域的包装。 何时使用 需要用户输入表单域内容时。 提供组合型输入框&#xff0c;带搜索的输入框&#xff0c;还可以进行大小选择。 案例&#xff1a;基本用法 <script setup> import {ref, watch}…

CPRI协议的理解——CPRI中的扰码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 CPRI协议的理解——CPRI中的扰码 前言8B10B线路编码下的扰码发送端接收 64B66B线路编码下的扰码带有终止控制字符的控制块格式带有起始控制字符的控制块格式数据块格式 前言 …