iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何建立一个超图详解
  • 547
分享到

如何建立一个超图详解

2024-04-02 19:04:59 547人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1.图和超图 图作为一种数据结构,由节点和边组成,可由下图表示。其中一个边只能链接两个节点。一个图可表示为G=(v,e,w) 其中v表示节点,e表示边,w表示节点的特征。关于图的表示

1.图和超图

图作为一种数据结构,由节点和边组成,可由下图表示。其中一个边只能链接两个节点。一个图可表示为G=(v,e,w)

其中v表示节点,e表示边,w表示节点的特征。关于图的表示可参考,本文不再详述。

在这里插入图片描述

对于超图,其与图结构最主要的区别就是一条边可以连接多个节点,因此我们可以认为图是一种特殊的超图。超图结构如下图所示。

在这里插入图片描述

在这里插入图片描述

超图可表示为G=(υ,ε,ω)。其中υ为节点集合,ε为超边集合,ω为超边权重的对称矩阵。超图G可以关联矩阵H来表示,其词条定义为:

在这里插入图片描述

改公式可解释为如果某个节点属于某个超边,则关联矩阵H的值为1,否则为0。

对于单个节点v可定义为:

在这里插入图片描述

可解释为连接该节点的所有边乘上权重向量的和。

Dₑ和Dᵥ由d(v)和s(e)分别表示为超边和节点的对角矩阵。

单个边可定义为:

在这里插入图片描述

可以理解为该边包含的所有节点之和。

2.实例

下面举出一个具体实例帮助理解超图的构建。以该图为例

在这里插入图片描述

图中有8个节点,3个超边。超边的细化图如下:

在这里插入图片描述

假设权重&W&为全1矩阵,因为它对构建超图数据结果无影响,那么H为一个3行8列的矩阵,表示为:

h(1,1) = 0

h(2,1) = 1

h(3,1) = 0

h(4,1) = 1

h(5,1) = 0

h(6,1) = 0

h(7,1) = 0

h(8,1) = 1

h(1,2) = 1

h(2,2) = 0

h(3,2) = 0

h(4,2) = 0

h(5,2) = 0

h(6,2) = 1

h(7,2) = 1

h(8,2) = 0

h(1,3) = 0

h(2,3) = 0

h(3,3) = 1

h(4,3) = 0

h(5,3) = 1

h(6,3) = 0

h(7,3) = 1

h(8,3) = 0

H =

De​表示为:

d(1) = 1

d(2) = 1

d(3) = 1

d(4) = 1

d(5) = 1

d(6) = 1

d(7) = 2

d(8) = 1

Dv​表示为:

s(1) = 3

s(2) = 3

s(3) = 3

3.代码实现

下面我们用python代码进行编程,我们的目标是在知道节点的特征W通过特征的距离来生成 G \mathcal{G} G矩阵。路线为:W,H, G \mathcal{G} G。主要代码如下:


import numpy as np
#KNN生成H
x = np.array([[1,0,0,0,1,0,1,0,0,0],
        [1,1,1,0,0,0,1,1,1,0],
       [1,1,1,0,0,1,1,1,1,0],
       [0,1,0,0,0,0,1,0,1,0],
       [1,1,1,1,0,0,1,1,0,1],
       [1,0,1,0,0,1,0,1,1,0],
       [0,1,0,0,1,0,1,1,1,0],
       [0,1,1,0,1,0,1,0,1,1]])
def Eu_dis(x):
    """
    Calculate the distance among each raw of x
    :param x: N X D
                N: the object number
                D: Dimension of the feature
    :return: N X N distance matrix
    """
    x = np.mat(x)
    aa = np.sum(np.multiply(x, x), 1)
    ab = x * x.T
    dist_mat = aa + aa.T - 2 * ab
    dist_mat[dist_mat < 0] = 0
    dist_mat = np.sqrt(dist_mat)
    dist_mat = np.maximum(dist_mat, dist_mat.T)
    return dist_mat
def hyperedge_concat(*H_list):
    """
    Concatenate hyperedge group in H_list
    :param H_list: Hyperedge groups which contain two or more hypergraph incidence matrix
    :return: Fused hypergraph incidence matrix
    """
    H = None
    for h in H_list:
        if h is not None and h != []:
            # for the first H appended to fused hypergraph incidence matrix
            if H is None:
                H = h
            else:
                if type(h) != list:
                    H = np.hstack((H, h))
                else:
                    tmp = []
                    for a, b in zip(H, h):
                        tmp.append(np.hstack((a, b)))
                    H = tmp
    return H
def construct_H_with_KNN_from_distance(dis_mat, k_neig, is_probH=True, m_prob=1):
    """
    construct hypregraph incidence matrix from hypergraph node distance matrix
    :param dis_mat: node distance matrix
    :param k_neig: K nearest neighbor
    :param is_probH: prob Vertex-Edge matrix or binary
    :param m_prob: prob
    :return: N_object X N_hyperedge
    """
    n_obj = dis_mat.shape[0]
    # construct hyperedge from the central feature space of each node
    n_edge = n_obj
    H = np.zeros((n_obj, n_edge))
    for center_idx in range(n_obj):
        dis_mat[center_idx, center_idx] = 0
        dis_vec = dis_mat[center_idx]
        nearest_idx = np.array(np.argsort(dis_vec)).squeeze()
        avg_dis = np.average(dis_vec)
        if not np.any(nearest_idx[:k_neig] == center_idx):
            nearest_idx[k_neig - 1] = center_idx
        for node_idx in nearest_idx[:k_neig]:
            if is_probH:
                H[node_idx, center_idx] = np.exp(-dis_vec[0, node_idx] ** 2 / (m_prob * avg_dis) ** 2)
            else:
                H[node_idx, center_idx] = 1.0
    return H
def construct_H_with_KNN(X, K_neigs=[10], split_diff_scale=False, is_probH=True, m_prob=1):
    """
    init multi-scale hypergraph Vertex-Edge matrix from original node feature matrix
    :param X: N_object x feature_number
    :param K_neigs: the number of neighbor expansion
    :param split_diff_scale: whether split hyperedge group at different neighbor scale
    :param is_probH: prob Vertex-Edge matrix or binary
    :param m_prob: prob
    :return: N_object x N_hyperedge
    """
    if len(X.shape) != 2:
        X = X.reshape(-1, X.shape[-1])
    if type(K_neigs) == int:
        K_neigs = [K_neigs]
    dis_mat = Eu_dis(X)
    H = []
    for k_neig in K_neigs:
        H_tmp = construct_H_with_KNN_from_distance(dis_mat, k_neig, is_probH, m_prob)
        if not split_diff_scale:
            H = hyperedge_concat(H, H_tmp)
        else:
            H.append(H_tmp)
    return H
H = construct_H_with_KNN(x)
#生成G
def generate_G_from_H(H, variable_weight=False):
    """
    calculate G from hypgraph incidence matrix H
    :param H: hypergraph incidence matrix H
    :param variable_weight: whether the weight of hyperedge is variable
    :return: G
    """
    if type(H) != list:
        return _generate_G_from_H(H, variable_weight)
    else:
        G = []
        for sub_H in H:
            G.append(generate_G_from_H(sub_H, variable_weight))
        return G
def _generate_G_from_H(H, variable_weight=False):
    """
    calculate G from hypgraph incidence matrix H
    :param H: hypergraph incidence matrix H
    :param variable_weight: whether the weight of hyperedge is variable
    :return: G
    """
    H = np.array(H)
    n_edge = H.shape[1]
    # the weight of the hyperedge
    W = np.ones(n_edge)
    # the degree of the node
    DV = np.sum(H * W, axis=1)
    # the degree of the hyperedge
    DE = np.sum(H, axis=0)
    invDE = np.mat(np.diag(np.power(DE, -1)))
    DV2 = np.mat(np.diag(np.power(DV, -0.5)))
    W = np.mat(np.diag(W))
    H = np.mat(H)
    HT = H.T
    if variable_weight:
        DV2_H = DV2 * H
        invDE_HT_DV2 = invDE * HT * DV2
        return DV2_H, W, invDE_HT_DV2
    else:
        G = DV2 * H * W * invDE * HT * DV2
        return G
G = generate_G_from_H(H)

实验结果:

H

在这里插入图片描述

G

在这里插入图片描述

到此这篇关于如何建立一个超图的文章就介绍到这了,希望对你有帮助,更多相关超图内容请搜索编程网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持编程网!

--结束END--

本文标题: 如何建立一个超图详解

本文链接: https://www.lsjlt.com/news/123746.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何建立一个超图详解
    1.图和超图 图作为一种数据结构,由节点和边组成,可由下图表示。其中一个边只能链接两个节点。一个图可表示为G=(v,e,w) 其中v表示节点,e表示边,w表示节点的特征。关于图的表示...
    99+
    2024-04-02
  • python如何建立一个文件
    python中建立一个文件的方法:1、在win操作系统中找到python程序目录;2、打开idle工具;3、在idle中新建一个shell脚本;4、输入“import os”指令导入os模块;5、通过“os.mknod(文件名)”指令建立一...
    99+
    2024-04-02
  • 如何建立与优化一个网
    这期内容当中小编将会给大家带来有关如何建立与优化一个网,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。打开一看,确实没有什么特色或者新意,出于关心,我问他为什么要选择做导航站,他的回答竟然是做导航站简单,不...
    99+
    2023-06-12
  • 如何建立一个LINQ ASP.NET网站
    小编给大家分享一下如何建立一个LINQ ASP.NET网站,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近使我激动不已的新鲜事之一就是LINQ系列技术的出现,包...
    99+
    2023-06-17
  • ubuntu中如何建立一个目录
    ubuntu中建立一个目录需要使用“mkdir ”命令,方法步骤:1、打开ubuntu终端;2、在命令行中输入“mkdir 目录名”命令建立一个目录即可。具体操作步骤:在ubuntu系统桌面中使用快捷键【Ctrl+Alt+T】打开ubunt...
    99+
    2024-04-02
  • 如何建立一个XMLHttpRequest对象池
    这篇文章主要介绍“如何建立一个XMLHttpRequest对象池”,在日常操作中,相信很多人在如何建立一个XMLHttpRequest对象池问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • 如何建立一个Ansible实验室
    小编给大家分享一下如何建立一个Ansible实验室,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!工具和软件本方案使用以下工具和软件:Ansible 是我...
    99+
    2023-06-15
  • win11更新后会建立一个分区如何解决
    这篇文章主要介绍了win11更新后会建立一个分区如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win11更新后会建立一个分区如何解决文章都会有所收获,下面我们一起来看看吧。情况一:如果我们在安装win1...
    99+
    2023-07-01
  • 详解如何创建一个.NETCore工程
    1、打开VS2019,点击“创建新项目”,选择“ASP.NET Core Web应用”,设置路径和文件名,选择目标框架(.net co...
    99+
    2024-04-02
  • Ubuntu如何建立一个Android开发环境
    这篇文章主要讲解了“Ubuntu如何建立一个Android开发环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Ubuntu如何建立一个Android开发环境”吧!安装Ubuntu虚拟机安装...
    99+
    2023-07-04
  • mysql如何创建一个视图
    要创建一个视图,可以使用以下语法: CREATE VIEW view_name AS SELECT column1, col...
    99+
    2024-04-20
    mysql
  • C语言邻接表建立图详解
    目录有向图无向图邻接表存图进行拓扑排序总结有向图 代码: #include<stdio.h> #include<stdlib.h> #include<...
    99+
    2024-04-02
  • 如何在idea中创建一个SpringBoot项目(超详细教学)
    如何在idea中创建一个SpringBoot项目 目录 环境准备 1.1打开IDEA,点击New新建一个项目 1.2 使用Spring Initializr方式构建Spring Boot项目  1.3 设置项目所属组,项目名称,选择java...
    99+
    2023-09-02
    intellij-idea spring boot java
  • 使用Pycharm创建一个Django项目的超详细图文教程
    目录Django 简介创建Django的虚拟环境创建Django项目总结 Django 简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV...
    99+
    2024-04-02
  • 2022版IDEA创建一个maven项目的超详细图文教程
    目录一.设置idea中指定的maven的位置以及本地存储仓库 二.新建项目2.1 按模板创建一个web项目的maven项目2.2 不按模板创建一个web项目的ma...
    99+
    2023-02-05
    IDEA创建maven项目 idea maven项目 idea创建java项目
  • 在python中如何建立一个自己的包
    目录python如何建立一个自己的包一些概念如何建立(示例)导入自己写好的python包实例总结python如何建立一个自己的包 一些概念 模块:我们写的每个py都是一个模块包:模块...
    99+
    2023-02-17
    python建立包 python自己的包 python建立一个自己的包
  • ubuntu中如何建立一个空文本文件
    ubuntu中建立一个空文本文件的方法:1、打开ubuntu终端;2、在命令行中输入“touch 文件名.txt”命令建立一个空文本文件即可。具体操作方法如下:在ubuntu系统桌面中使用快捷键【Ctrl+Alt+T】打开ubuntu终端命...
    99+
    2024-04-02
  • MySQL中如何创建一个视图
    在 MySQL 中创建一个视图可以通过使用 CREATE VIEW 语句来完成。视图是基于一个或多个表的查询结果,它类似于虚拟表,可以像表一样查询和使用。 下面是创建一个视图的基本语法: CREATE VIEW view_name ASSE...
    99+
    2023-08-17
    mysql 数据库
  • 阿里云如何建立一个服务器账号
    简介 阿里云是中国领先的云计算服务提供商之一,提供了丰富的云计算产品和服务。在使用阿里云之前,首先需要建立一个服务器账号。本文将介绍如何在阿里云上建立一个服务器账号。步骤一:注册阿里云账号首先,你需要前往阿里云官网(https://www....
    99+
    2024-01-30
    阿里 建立一个 账号
  • 详解如何在ChatGPT内构建一个Python解释器
    目录下面是初始化ChatGPT的命令:总结引用:Art Kulakov 《How to Build a Python Interpreter Inside ChatGPT》 这个灵感...
    99+
    2023-02-15
    ChatGPT构建Python解释器 ChatGPT Python解释器 ChatGPT Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作