Hypergraph Models超图模型

      最近看了篇Paper(Hyperspectral Image Classification Through Bilayer Graph-Based Learning),里面出现了一个超图(Hypergraph)的概念,在这里对它的概念进行说明。

      超图(Hypergraph)是什么

      简单的来说,对于我们熟悉的图而言,它的一个边(edge)只能和两个顶点连接;而对于超图来讲,人们定义它的边(这里叫超边,hyperedge)可以和任意个数的顶点连接。一个图和超图的示意图如下所示:


      而对于超图的一个严格的数学定义,维基百科上是这样写的:

      在数学中,超图是图的一般化。对于超图来说,它的一条边可以连接任意数量的顶点。正式的说,超图H可以表示为H=(X,E),X为元素的集合,成为节点或顶点,E是X的一组非空子集,成为超边。(In mathematics, a hypergraph is a generalization of a graph, where an edge can connect any number of vertices. Formally, a hypergraph H is a pair H = (X,E) where X is a set of elements, called nodes or vertices, and E is a set of non-empty subsets of X called hyperedges or links.)

      k-均匀超图(k-uniform hypergraph)

      对于超图而言,还有一个k-均匀超图的概念(k-uniform hypergraph)。它指超图的每个边连接的顶点个数都是相同的,即为个数k。所以2-均匀超图就是我们传统意义上的图,3-均匀超图就是一个三元组的集合,以此类推。

      While graph edges are pairs of nodes, hyperedges are arbitrary sets of nodes, and can therefore contain an arbitrary number of nodes. However, it is often useful to study hypergraphs where all hyperedges have the same cardinality: a k-uniform hypergraph is a hypergraph such that all its hyperedges have size k. (In other words, it is a collection of sets of size k.) So a 2-uniform hypergraph is a graph, a 3-uniform hypergraph is a collection of triples, and so on.

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于超图的知识追踪模型相比于基于传统神经网络的模型更为复杂,其实现过程需要用到超图的相关概念和算法。以下是一个基于超图的知识追踪模型的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim from hypernetx import Hypergraph class HypergraphKnowledgeTrackingModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(HypergraphKnowledgeTrackingModel, self).__init__() self.hidden_size = hidden_size self.lstm = nn.LSTM(input_size, hidden_size) self.linear = nn.Linear(hidden_size, output_size) self.softmax = nn.LogSoftmax(dim=1) self.hg = Hypergraph() def forward(self, input, hidden): output, hidden = self.lstm(input.view(1, 1, -1), hidden) output = self.linear(output.view(1, -1)) output = self.softmax(output) return output, hidden def init_hidden(self): return (torch.zeros(1, 1, self.hidden_size), torch.zeros(1, 1, self.hidden_size)) def build_hypergraph(self, inputs, labels): for i in range(len(inputs)): self.hg.add_node(i, features=inputs[i]) self.hg.nodes[i]['label'] = labels[i] self.hg.add_hyperedge(*range(len(inputs))) def propagate(self, node_id): neighbors = self.hg.neighbors(node_id) message = torch.zeros(self.hidden_size) for neighbor in neighbors: message += self.hg.nodes[neighbor]['features'] message /= len(neighbors) self.hg.nodes[node_id]['features'] = message def update_hypergraph(self): for node_id in self.hg.nodes: self.propagate(node_id) def train_hypergraph(self, epochs): for epoch in range(epochs): self.update_hypergraph() hidden = self.init_hidden() for node_id in self.hg.nodes: self.zero_grad() output, hidden = self(self.hg.nodes[node_id]['features'], hidden) label = self.hg.nodes[node_id]['label'] loss = nn.NLLLoss()(output, label) loss.backward() optimizer.step() # example usage input_size = # 输入向量的维数 hidden_size = # LSTM隐藏层的维数 output_size = # 输出向量的维数 model = HypergraphKnowledgeTrackingModel(input_size, hidden_size, output_size) inputs = # 训练数据集的输入向量 labels = # 训练数据集的标签 model.build_hypergraph(inputs, labels) optimizer = optim.SGD(model.parameters(), lr=0.1) model.train_hypergraph(10) inputs = # 测试数据集的输入向量 hidden = model.init_hidden() for i in range(len(inputs)): output, hidden = model(inputs[i], hidden) print(output) ``` 该模型使用了一个单层LSTM神经网络和一个超图进行知识追踪。在构建超图时,每个输入向量作为一个节点,节点特征为该向量,节点标签为该向量对应的类别。在训练过程中,对于超图中的每个节点,将其特征向量作为LSTM网络的输入,将该节点的标签作为LSTM网络的输出,使用交叉熵作为损失函数,随机梯度下降作为优化算法。在更新超图时,对于每个节点,将其与其邻居节点的特征向量求平均值,作为该节点的新特征向量。最终得到的超图可以用于对新的输入向量进行分类预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值