GCN从理论到实践——基于PyTorch的图卷积网络层实现
Hi,大家好,我是半亩花海。图卷积网络(Graph Convolutional Network, GCN)是一种处理图结构数据的深度学习模型。它通过聚合邻居节点的信息来更新每个节点的特征表示,广泛应用于社交网络分析、推荐系统和生物信息学等领域。本实验通过实现一个简单的 GCN 层,展示了其核心思想,并通过具体代码示例说明了 GCN 层的工作原理。
目录
一、图卷积网络的含义
二、实验展示——基于PyTorch的图卷积网络(GCN)层实现
(一)实验目标
(二)实验方法
(三)实验结果分析
(四)思考与总结
三、完整代码
四、参考文章
一、图卷积网络的含义
说起图卷积神经网络(Graph Convolutional networks, GCN),可以先探讨一下卷积神经网络(CNN),CNN 中的卷积本质上就是利用共享参数的过滤器,通过计算中心像素点以及相邻像素点的加权和来实现空间特征的提取。而 GCN 也是如此,类似于图像中的卷积处理,它依赖于节点间的消息传递方法,这意味着节点与其邻居点交换信息,并相互发送消息。
在看具体的数学表达式之前,我们可以试着直观地理解 GCN 是如何工作的,可分为以下两大步骤:
- 第一步:每个节点创建一个特征向量,表示它要发送给所有邻居的消息。
- 第二步:消息被发送到相邻节点,这样每个节点均会从其相邻节点接收一条消息。
下面的图可视化了以上两大步骤:
那么随后该如何组合节点、接收消息呢?
由于节点间消息的数量不同,需要一个适用于任意数量的操作,通常的方法是求和或取平均值。令 表示节点 以前的特征表示,
为整合消息后的特征表示,GCN 层定义如下:
是将输入特征转换为消息的权重参数。在邻接矩阵 A 的基础上,加上单位矩阵,以便每个节点也向自身发送消息,即:
。最后,为了取平均值的运算,需要用到矩阵
,这是一个对角矩阵,
表示节点
的邻居数。
表示一个任意的激活函数,当然,不一定是 Sigmoid,事实上,在 GNN 中通常使用基于 ReLU 的激活函数。
二、实验展示——基于PyTorch的图卷积网络(GCN)层实现
(一)实验目标
- 理解 GCN 层的基本原理。
- 实现一个简单的 GCN 层,并通过手动设置权重矩阵验证其计算过程。
- 分析输入节点特征与邻接矩阵如何影响输出特征。
(二)实验方法
在 PyTorch 中实现 GCN 层时,我们可以灵活地利用张量进行运算,不必定义矩阵 ,只需将求和的消息除以之后的邻居数即可。此外,线性层便是以上的权重矩阵,同时可添加偏置(bias)。基于 PyTorch,定义GCN层的具体步骤如下所示。
1. 导入必要的库
import torch
import torch.nn as nn
torch:
PyTorch 深度学习框架的核心库,用于张量操作和自动求导。torch.nn:
提供了构建神经网络所需的模块和函数。
2. 定义图卷积层(GCNLayer)
class GCNLayer(nn.Module):def __init__(self, c_in, c_out):"""Inputs::param c_in: 输入特征维度:param c_out: 输出特征维度"""super().__init__()self.projection = nn.Linear(c_in, c_out) # 线性层
GCNLayer
继承自nn.Module
,是 PyTorch 中所有神经网络模块的基类。c_in
和c_out
分别表示输入特征和输出特征的维度。self.projection
是 PyTorch 中的线性变换层,将输入特征从c_in
维映射到c_out
维。其公式为:
3. 前向传播
def forward(self, node_feats, adj_matrix):"""输入::param node_feats: 节点特征表示,大小为 [batch_size, num_nodes, c_in]:param adj_matrix: 邻接矩阵,大小为 [batch_size, num_nodes, num_nodes]:return: 更新后的节点特征"""num_neighbors = adj_matrix.sum(dim=-1, keepdims=True) # 各节点的邻居数node_feats = self.projection(node_feats) # 将特征转化为消息# 各邻居节点消息求和并求平均node_feats = torch.bmm(adj_matrix, node_feats)node_feats = node_feats / num_neighborsreturn node_feats
- 输入参数:
node_feats:
表示每个节点的特征,形状为[batch_size, num_nodes, c_in]
。adj_matrix:
图的邻接矩阵,形状为[batch_size, num_nodes, num_nodes]
。
- 步骤解析:
- 计算邻居数量:
num_neighbors = adj_matrix.sum(dim=-1, keepdims=True)
计算每个节点的邻居数量(包括自身)。- 线性变换:
node_feats = self.projection(node_feats)
对节点特征进行线性变换。- 邻居信息聚合:
torch.bmm(adj_matrix, node_feats)
使用批量矩阵乘法(Batch Matrix Multiplication)将邻居节点的消息加权求和。- 归一化:
node_feats = node_feats / num_neighbors
将聚合结果按邻居数量归一化,得到每个节点的更新特征。
4. 实验数据准备
node_feats = torch.arange(8, dtype=torch.float32).view(1, 4, 2)
adj_matrix = torch.Tensor([[[1, 1, 0, 0],[1, 1, 1, 1],[0, 1, 1, 1],[0, 1, 1, 1]]])
print("节点特征:\n", node_feats)
print("添加自连接的邻接矩阵:\n", adj_matrix)
(1)节点特征
node_feats
是一个形状为[1, 4, 2]
的张量,表示一个批次中 4 个节点的特征,每个节点有 2 维特征。
节点特征:tensor([[[0., 1.],[2., 3.],[4., 5.],[6., 7.]]])
(2)邻接矩阵
adj_matrix
是一个形状为[1, 4, 4]
的张量,表示图的邻接矩阵。
添加自连接的邻接矩阵:tensor([[[1., 1., 0., 0.],[1., 1., 1., 1.],[0., 1., 1., 1.],[0., 1., 1., 1.]]])
- 邻接矩阵中的元素为 1 表示两个节点之间存在连接,0 表示无连接。
5. 初始化GCN层并设置权重
layer = GCNLayer(c_in=2, c_out=2)
# 初始化权重矩阵
layer.projection.weight.data = torch.Tensor([[1., 0.], [0., 1.]])
layer.projection.bias.data = torch.Tensor([0., 0.])
- 创建一个
GCNLayer
实例,输入特征维度为 2,输出特征维度也为 2。 - 手动初始化权重矩阵和偏置(bia):
- 权重矩阵为单位矩阵,表示不改变输入特征:
(该单位矩阵的值
)
- 偏置为零向量:
- 权重矩阵为单位矩阵,表示不改变输入特征:
由于权重矩阵是单位矩阵,偏置为零,线性变换的公式简化为:
因此,线性变换后的节点特征与输入特征相同。
6. 前向传播并计算输出特征
# 将节点特征和添加自连接的邻接矩阵输入 GCN 层
with torch.no_grad():out_feats = layer(node_feats, adj_matrix)print("节点输出特征:\n", out_feats)
- 使用
torch.no_grad()
关闭梯度计算,避免不必要的内存开销。 - 调用
layer(node_feats, adj_matrix)
进行前向传播,得到更新后的节点特征。 - 输出结果:
节点输出特征:tensor([[[1., 2.],[3., 4.],[4., 5.],[4., 5.]]])
(三)实验结果分析
1. 输入数据
(1)节点特征
节点特征是一个大小为 [1, 4, 2]
的张量,表示一个批次中有 4 个节点,每个节点有 2 维特征。具体值如下:
tensor([[[0., 1.],[2., 3.],[4., 5.],[6., 7.]]])
- 节点 0 的特征为:
[0., 1.]
- 节点 1 的特征为:
[2., 3.]
- 节点 2 的特征为:
[4., 5.]
- 节点 3 的特征为:
[6., 7.]
(2)邻接矩阵
邻接矩阵是一个大小为 [1, 4, 4]
的张量,表示 4 个节点之间的连接关系。具体值如下:
tensor([[[1., 1., 0., 0.],[1., 1., 1., 1.],[0., 1., 1., 1.],[0., 1., 1., 1.]]])
- 节点 0 的邻居为:节点 0 和节点 1。
- 节点 1 的邻居为:节点 0、节点 1、节点 2 和节点 3。
- 节点 2 的邻居为:节点 1、节点 2 和节点 3。
- 节点 3 的邻居为:节点 1、节点 2 和节点 3。
如何通过邻接矩阵来判断每个节点的邻居是什么?——看值为1的索引是多少,那么邻居便是多少。
[[1., 1., 0., 0.], # 节点0的邻居:值为1的列索引为[0, 1],即节点0和节点1。[1., 1., 1., 1.], # 节点1的邻居:值为1的列索引为[0, 1, 2, 3],即节点0、节点1、节点2和节点3。[0., 1., 1., 1.], # 节点2的邻居:值为1的列索引为[1, 2, 3],即节点1、节点2和节点3。[0., 1., 1., 1.]] # 节点3的邻居:值为1的列索引为[1, 2, 3],即节点1、节点2和节点3。
本实验中的图 G 的图示如下:
2. 输出特征分析
经GCN层的前向传播后,得到输出特征,其形状为 [1, 4, 2]
的张量,表示更新后的节点特征。
tensor([[[1., 2.],[3., 4.],[4., 5.],[4., 5.]]])
GCN 层通过邻接矩阵聚合邻居节点的消息。具体计算如下:对于每个节点,将其邻居节点的特征相加。再将聚合后的特征除以邻居数量,得到平均特征,即最终的输出特征。下面逐节点分析输出特征的计算过程:
(1)节点0的计算
- 邻居节点:节点0和节点1。
- 聚合特征:
[0., 1.] + [2., 3.] = [2., 4.]
- 邻居数量:2
- 平均特征:
[2., 4.] / 2 = [1., 2.]
(2)节点1的计算
- 邻居节点:节点0、节点1、节点2和节点3。
- 聚合特征:
[0., 1.] + [2., 3.] + [4., 5.] + [6., 7.] = [12., 16.]
- 邻居数量:4
- 平均特征:
[12., 16.] / 4 = [3., 4.]
(3)节点2的计算
- 邻居节点:节点1、节点2和节点3。
- 聚合特征:
[2., 3.] + [4., 5.] + [6., 7.] = [12., 15.]
- 邻居数量:3
- 平均特征:
[12., 15.] / 3 = [4., 5.]
(4)节点3的计算
- 邻居节点:节点1、节点2和节点3。
- 聚合特征:
[2., 3.] + [4., 5.] + [6., 7.] = [12., 15.]
- 邻居数量:3
- 平均特征:
[12., 15.] / 3 = [4., 5.]
通过上述分析可以看出,GCN 层的核心思想是通过聚合邻居节点的信息来更新每个节点的特征表示。具体来说:
- 线性变换 :首先对输入特征进行线性变换(本实验中权重矩阵为单位矩阵,因此特征未发生变化)。
- 邻居信息聚合 :通过邻接矩阵将邻居节点的特征加权求和。
- 归一化 :将聚合结果按邻居数量归一化,得到最终的节点特征。
(四)思考与总结
1. 思考
如上所见,第一个节点的输出值是其自身和第二个节点的平均值,其他节点同理。当然,在具体实践中,我们还希望允许节点之间的消息传递不仅仅局限于邻居节点,还可以通过应用多个 GCN 层来实现,而很多的 GNN 即是由多个 GCN 和非线性(如 ReLU)的组合构建而成,如下图所示:
通过以上 GCN 层的运算示例,发现一个问题,即节点 3 和 4 的输出相同,这是因为它们具有相同的相邻节点(包括自身)输入,再取均值,所得到的值便一样了。这在大部分情况下并不合理。
2. 总结
本实验通过实现一个简单的 GCN 层,展示了图卷积网络的核心思想——通过聚合邻居节点的信息来更新节点特征。通过手动设置权重矩阵和偏置,我们验证了 GCN 层的计算过程,并分析了输入特征与邻接矩阵对输出特征的影响。实验结果表明,GCN 层能够有效地捕捉图结构中的局部信息。
未来可以进一步扩展该实验:
- 引入非线性激活函数 :在 GCN 层中加入 ReLU 等非线性激活函数,增强模型的表达能力。
- 多层 GCN :堆叠多个 GCN 层,以捕获更高阶的邻居信息。
- 真实数据集实验 :在实际图数据集(如 Cora 或 Citeseer)上测试 GCN 模型的性能。
- 优化算法 :结合梯度下降等优化算法,训练 GCN 模型以完成特定任务(如节点分类或链接预测)。
通过这些扩展,可以更全面地理解图卷积网络的工作原理及其在实际问题中的应用价值。
三、完整代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@Project : GNN/GCN
@File : gcn1.py
@IDE : PyCharm
@Author : 半亩花海
@Date : 2025/02/28 21:33
"""
import torch
import torch.nn as nnclass GCNLayer(nn.Module):def __init__(self, c_in, c_out):"""Inputs::param c_in: 输入特征:param c_out: 输出特征"""super().__init__()self.projection = nn.Linear(c_in, c_out); # 线性层def forward(self, node_feats, adj_matrix):"""输入:param node_feats: 节点特征表示,大小为[batch_size,num_nodes,c_in]:param adj_matrix: 邻接矩阵:[batch_size,num_nodes,num_nodes]:return:"""num_neighbors = adj_matrix.sum(dim=-1, keepdims=True) # 各节点的邻居数node_feats = self.projection(node_feats) # 将特征转化为消息# 各邻居节点消息求和并求平均node_feats = torch.bmm(adj_matrix, node_feats)node_feats = node_feats / num_neighborsreturn node_featsnode_feats = torch.arange(8, dtype=torch.float32).view(1, 4, 2)
adj_matrix = torch.Tensor([[[1, 1, 0, 0],[1, 1, 1, 1],[0, 1, 1, 1],[0, 1, 1, 1]]])
print("节点特征:\n", node_feats)
print("添加自连接的邻接矩阵:\n", adj_matrix)layer = GCNLayer(c_in=2, c_out=2)
# 初始化权重矩阵
layer.projection.weight.data = torch.Tensor([[1., 0.], [0., 1.]])
layer.projection.bias.data = torch.Tensor([0., 0.])# 将节点特征和添加自连接的邻接矩阵输入 GCN 层
with torch.no_grad():out_feats = layer(node_feats, adj_matrix)print("节点输出特征:\n", out_feats)
四、参考文章
[1] 实战-----基于 PyTorch 的 GNN 搭建_pytorch gnn-CSDN博客
[2] 图神经网络简单理解 — — 附带案例_图神经网络实例-CSDN博客
[3] 一文快速预览经典深度学习模型(二)——迁移学习、半监督学习、图神经网络(GNN)、联邦学习_迁移学习 图神经网络-CSDN博客
相关文章:
GCN从理论到实践——基于PyTorch的图卷积网络层实现
Hi,大家好,我是半亩花海。图卷积网络(Graph Convolutional Network, GCN)是一种处理图结构数据的深度学习模型。它通过聚合邻居节点的信息来更新每个节点的特征表示,广泛应用于社交网络分析、推荐系统和生物信息学等领…...
Ollama存在安全风险的情况通报及解决方案
据清华大学网络空间测绘联合研究中心分析,开源跨平台大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患。鉴于目前DeepSeek等大模型的研究部署和应用非常广泛,多数用户使用Ollama私有化部署且未修改默认配置,存在数据泄露、算力盗…...
大模型在高血压预测及围手术期管理中的应用研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、大模型预测高血压的原理与方法 2.1 常用大模型介绍 2.2 数据收集与预处理 2.3 模型训练与验证 三、术前风险预测与手术方案制定 3.1 术前风险因素分析 3.2 大模型预测术前风险的方法与结果 …...
网络安全rt是什么意思
1.什么时EDR :完全不同以往的端点被防护思路,而是通过云端威胁情报,机器学习,异常行为分析,攻击指示器等方式,主动发现来自外部或内部的安全威胁 。并进行自动化的阻止,取证,补救和溯源从而有效…...
数据结构篇—栈(stack)
一、引入 在数学史上有这样一个经典问题——汉诺塔问题。 通过动图演示我们发现每一个圆片的运动是什么样的呢? 我们发现,第一个放入的最大圆片将位于整个塔的最底端。所以若想将最大圆片拿出来,就得将压在它身上的所有圆片先按顺序取出才能将…...
python3.13安装教程【2025】python3.13超详细图文教程(包含安装包)
文章目录 前言一、python3.13安装包下载二、Python 3.13安装步骤三、Python3.13验证 前言 本教程将为你详细介绍 Python 3.13 python3.13安装教程,帮助你顺利搭建起 Python 3.13 开发环境,快速投身于 Python 编程的精彩实践中。 一、python3.13安装包下…...
动态内存分配
动态内存分配 1. malloc1.1函数原型1.2参数1.3特点1.4注意事项 2.calloc2.1函数原型2.2参数2.3特点2.4注意事项 3.realloc3.1函数原型3.2参数3.3特点3.4注意事项 4.free4.1 函数原型4.2参数4.3特点 结语 在 C 语言中,主要使用标准库函数 <stdlib.h> 中的几个函…...
物联网设备数据割裂难题:基于OAuth2.0的分布式用户画像系统设计!格行代理是不是套路?2025有什么比较好的副业?低成本的创业好项目有哪些?
一、行业基本面:双赛道增长逻辑验证 1.1 随身WiFi市场:场景红利与技术博弈 移动办公、户外直播等场景推动随身WiFi需求持续增长,格行核心的三网切换技术(移动/联通/电信自动择优)有效解决单一运营商信号覆盖盲区问题&…...
17.10 LangSmith Evaluation 深度实战:构建智能评估体系驱动大模型进化
LangSmith Evaluation 深度实战:构建智能评估体系驱动大模型进化 关键词:LangSmith 评估体系, 大模型质量评估, 自动化评测流水线, 多维度指标分析, 生产环境模型监控 1. 评估体系设计哲学 LangSmith Evaluation 采用 规则评估+模型评估+人工反馈 三位一体的评估框架: #me…...
Gravitino SparkConnector 实现原理
Gravitino SparkConnector 实现原理 本文参考了官网介绍,想看官方解析请参考 官网地址 本文仅仅介绍原理 文章目录 Gravitino SparkConnector 实现原理背景知识-Spark Plugin 介绍(1) **插件加载**(2) **DriverPlugin 初始化**(3) **ExecutorPlugin 初始化**(4) *…...
前端开发好用的AI工具介绍
以下是前端开发中提升效率的 AI 工具 推荐,涵盖代码生成、UI设计、调试优化等场景: 一、代码生成与辅助工具 工具名称特点适用场景GitHub Copilot基于 OpenAI,智能代码补全(支持 JS/TS/React/Vue)快速生成代码片段、函…...
Linux的用户与权限--第二天
认知root用户(超级管理员) root用户用于最大的系统操作权限 普通用户的权限,一般在HOME目录内部不受限制 su与exit命令 su命令: su [-] 用户名 -符号是可选的,表示切换用户后加载环境变量 参数为用户名,…...
COUNT(CASE WHEN ... THEN ... END)详解
在 SQL 查询中,COUNT(CASE WHEN ... THEN ... END) 是一种常见的用法,用于统计满足特定条件的记录数。具体例子: # sexType 2表示女生 COUNT(CASE WHEN h_employee.sexType 2 THEN 1 END) AS 女员工人数解释 CASE WHEN ... THEN ... END&a…...
音视频入门基础:RTP专题(14)——FFmpeg源码中,对H.264的各种RTP有效载荷结构的解析
一、引言 由《音视频入门基础:RTP专题(10)——FFmpeg源码中,解析RTP header的实现》可以知道,FFmpeg源码的rtp_parse_packet_internal函数的前半部分实现了解析某个RTP packet的RTP header的功能。而在解析完RTP head…...
FPGA——4位全加器及3-8译码器的实现
文章目录 一、全加器1、Verilog实现四位全加器2、下载测试 二、3-8译码器1、Verilog实现3-8译码器2、7段数码管显示3-8译码器 三、总结四、参考资料 一、全加器 全加器的定义: 全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合…...
软考中级-数据库-3.4 数据结构-图
图的定义 一个图G(Graph)是由两个集合:V和E所组成的,V是有限的非空顶点(Vertex)集合,E是用顶点表示的边(Edge)集合,图G的顶点集和边集分别记为V(G)和E(G),而将图G记作G(V,E)。可以看出,一个顶点集合与连接这…...
软考中级-数据库-3.3 数据结构-树
定义:树是n(n>=0)个结点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3...,Tm…,其中每个集合又都是一棵树,并且称为根结点的子树。 树的相关概念 1、双亲、孩子和兄弟: 2、结点的度:一个结…...
Win11被背刺,官方泄露免费激活方法
AI已经成为科技圈的主旋律了,在PC圈的龙头微软也不例外。 但最近喜欢背刺用户、极力推崇AI的微软被自家产品背刺了一把。 罪魁祸首就是Microsoft Copilot,如果向Microsoft Copilot提问,是否可以帮忙提供激活Windows11的脚本。 Copilot会立马…...
第十天-字符串:编程世界的文本基石
在编程的广阔领域中,字符串是极为重要的数据类型,它就像一座桥梁,连接着人类的自然语言和计算机能够理解与处理的数字信息。下面,让我们深入探索字符串的世界。 一、字符串简介 字符串是由零个或多个字符组成的有序序列ÿ…...
CentOS7 安装Redis 6.2.6 详细教程
本文主要介绍CentOS7系统下安装Redis6.2.6的详细教程。 1.安装依赖 redis是基于C语言开发,因此想要在服务器上运行redis需要验证是否安装了gcc,没有安装gcc则需先安装 查看是否安装gcc gcc -v如果没有安装gcc,则通过如下命令安装 yum in…...
VsCode使用
vscode前端vue项目启动:Vue项目的创建启动及注意事项-CSDN博客 vscode使用教程:史上最全vscode配置使用教程 - 夏天的思考 - 博客园 vscode如何从git拉取代码:vscode如何从git拉取代码 • Worktile社区...
mac上最好的Python开发环境之Anaconda+Pycharm
文章目录 一、前言 1. Anaconda介绍2. Pycharm介绍 编码协助项目代码导航代码分析Python重构支持Django框架集成版本控制 二、下载Anaconda和Pycharm 1. 下载Anaconda2. 下载Pycharm 三、安装Anaconda和Pycharm 1. 安装Anaconda2. 安装Pycharm 一、前言 1. Anaconda介绍 …...
防火墙旁挂组网双机热备负载均衡
一,二层交换网络: 使用MSTPVRRP组网形式 VLAN 2--->SW3为主,SW4 作为备份 VLAN 3--->SW4为主,SW3 作为备份 MSTP 设计 --->SW3 、 4 、 5 运行 实例 1 : VLAN 2 实例 2 : VLAN 3 SW3 是实例 1 的主根,实…...
Docker 学习(三)——数据管理
容器中的管理数据主要有两种方式: 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境; 数据 卷容器( Data Volume Containers): 使用特定容器维护数据卷 1.数据卷 数据卷…...
中间件专栏之MySQL篇——MySQL缓存策略
本文所说的MySQL缓存策略与前文提到的buffer pool不同,那是MySQL内部自己实现的,本问所讲的缓存策略是使用另一个中间件redis来缓存MySQL中的热点数据。 一、为什么需要MySQL缓存方案 缓存用户定义的热点数据,用户可以直接从缓存中获取热点…...
高频 SQL 50 题(基础版)_196. 删除重复的电子邮箱
高频 SQL 50 题(基础版)_196. 删除重复的电子邮箱 思路 思路 DELETE p1 FROM Person p1,Person p2 WHEREp1.Email p2.Email AND p1.Id > p2.Id...
github进不去,一直显示错误
1、进入网址Dns检测|Dns查询 - 站长工具 2、复制检测出来的任意一个ip 3、打开电脑的文件夹:C:\Windows\System32\drivers\etc 下的hosts文件下复制这个ip地址 20.205.243.166 4、winr 打开cmd,输入ipconfig/flushdns ipconfig/flushdns出现这个就可以…...
MWC 2025|美格智能发布基于高通®X85 5G调制解调器及射频的新一代5G-A通信模组SRM819W
3月3日,在MWC 2025世界移动通信大会上,美格智能正式推出基于高通X85调制解调器及射频的新一代5G-A通信模组SRM819W,集5G-A、毫米波、AI加持的网络优化等最前沿的通信技术,成为行业首批搭载高通X85的5G通信模组产品,将助…...
【零基础到精通Java合集】第十集:List集合框架
课程标题:List集合框架(15分钟) 目标:掌握List接口核心实现类(ArrayList/LinkedList)的使用与场景选择,熟练操作有序集合 0-1分钟:List概念引入 以“购物清单”类比List特性:元素有序(添加顺序)、可重复、支持索引访问。说明List是Java集合框架中最常用的数据结构…...
《今日-AI-编程-人工智能日报》
一、AI行业动态 荣耀发布“荣耀阿尔法战略” 荣耀在“2025世界移动通信大会”上宣布,将从智能手机制造商转型为全球领先的AI终端生态公司,并计划未来五年投入100亿美元建设AI设备生态。荣耀展示了基于GUI的个人移动AI智能体,并推出多款AI终端…...
在 MyBatis 中,若数据库字段名与 SQL 保留字冲突解决办法
在 MyBatis 中,若数据库字段名与 SQL 保留字冲突,可通过以下方法解决: 目录 一、使用转义符号包裹字段名二、通过别名映射三、借助 MyBatis-Plus 注解四、全局配置策略(辅助方案)最佳实践与注意事项 一、使用转义符号…...
从基础到实践(十):MOS管的全面解析与实际应用
MOS管(金属-氧化物半导体场效应晶体管)是现代电子技术的基石,凭借高输入阻抗、低功耗和易集成特性,成为数字电路、电源管理和信号处理的核心元件。从微处理器到新能源汽车电驱系统,其高效开关与放大功能支撑了计算机、…...
电源测试系统有哪些可以利用AI工具的科技??
AI技术的发展对电源模块测试系统的影响是深远的,不仅协助系统提升了测试效率和精度,还推动了测试方法的创新和智能化。那么在电源测试系统中哪些模块可以利用AI工具实现自动化测试? 1. 自动化测试与效率提升 智能测试流程优化 AI算法可以自动优化测试…...
RabbitMQ 最新版:安装、配置 与Java 接入详细教程
目录 一、RabbitMQ 简介二、RabbitMQ 的安装1. 安装 Erlang下载 Erlang安装 Erlang2. 安装 RabbitMQ下载 RabbitMQ安装 RabbitMQ3. 配置环境变量4. 启用管理插件三、RabbitMQ 的配置1. 创建用户和设置权限2. 配置文件四、Java 接入 RabbitMQ1. 添加依赖2. 创建连接3. 创建通道4…...
股市现期驱动因子
在股票投资中,我们把驱动股市收益的基本元素称为基本因素: 例如资产负债、现金流量 从短期来看,股市的上涨和下跌基于市场情绪,它更依赖于投资者的期望,投它涨的人多,它就涨。从长期来看,股市…...
物联网中的气象监测设备具备顶级功能
物联网中的气象监测设备具备顶级功能时,通常集成GPS、数据上报和预警系统,以确保精准监测和及时响应。以下是这些功能的详细说明: 1. GPS定位 精准定位:GPS模块提供设备的精确地理位置,确保数据与具体位置关联&#…...
算法1-4 凌乱的yyy / 线段覆盖
题目描述 现在各大 oj 上有 n 个比赛,每个比赛的开始、结束的时间点是知道的。 yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。 所以,他想知道他最多能参加几个比赛。 由于 yyy 是蒟蒻,…...
gn学习存档
以下答案均由deepseek提供,仅作学习存档。 1. 举例说明action和action_foreach区别 场景设定 假设需要处理一组文件: 输入文件:src/data/file1.txt, src/data/file2.txt, src/data/file3.txt处理逻辑:将每个 .txt 文件转换为 …...
SQL注入练习场:PHPStudy+SQLI-LABS靶场搭建教程(零基础友好版)
注意:文中涉及演示均为模拟测试,切勿用于真实环境,任何未授权测试都是违法行为! 一、环境准备 下载PHPStudy 官网下载地址:https://www.xp.cn/php-study(选择Windows版) 安装时建议选择自定…...
python学习笔记——Thread常用方法
Thread对象中的一些方法: 以前说过多线程,用到threading模块中的Thread对象,其中的start和run方法比较熟悉了,start()是重载了Thread对象中的run方法,其实作用还是,当执行这个start…...
2024年数学SCI2区TOP:雪雁算法SGA,深度解析+性能实测
目录 1.摘要2.算法原理3.结果展示4.参考文献5.代码获取 1.摘要 本文提出了一种雪雁算法(SGA),该算法借鉴了雪鹅的迁徙行为,并模拟了其迁徙过程中常见的“人字形”和“直线”飞行模式。 2.算法原理 雪雁以其卓越的长途迁徙能力和…...
Kubernetes 指令备忘清单
文章目录 查看资源信息节点容器组命名空间无状态服务守护进程集事件服务帐户日志副本集角色保密字典配置项路由持久卷持久卷声明存储类多个资源 变更资源属性污点标签维护/可调度清空节点节点/容器组无状态/命名空间服务守护进程集服务账号注释 添加资源创建容器组创建服务创建…...
servlet tomcat
在spring-mvc demo程序运行到DispatcherServlet的mvc处理 一文中,我们实践了浏览器输入一个请求,然后到SpringMvc的DispatcherServlet处理的整个流程. 设计上这些都是tomcat servlet的处理 那么究竟这是怎么到DispatcherServlet处理的,本文将…...
在 Ubuntu 系统 22.04 上安装 Docker
在 Ubuntu 系统 22.04 上安装 Docker 在 Ubuntu 系统 22.04 上安装 Docker1. 更新系统包2. 安装依赖工具3. 添加 Docker 官方 GPG 密钥4. 添加 Docker 的 APT 仓库5. 安装 Docker Engine6. 启动并设置 Docker 服务7. 验证安装8. 配置非 Root 用户权限(可选…...
一分钟理解Mybatis 里面的缓存机制
MyBatis 是一个流行的 Java 持久层框架,它简化了数据库操作。MyBatis 提供了强大的缓存机制,用于提升性能,减少数据库的访问次数。MyBatis 的缓存机制分为一级缓存和二级缓存。 该图展示了用户通过 SqlSession 发起查询请求,…...
【我的Android进阶之旅】如何使用NanoHttpd在Android端快速部署一个HTTP服务器?
文章目录 开篇:程序员的"摸鱼神器"?一、为什么选择NanoHttpd?二、五分钟极速上车指南2.1 ▶ 第一步:引入依赖的哲学2.2 ▶ 第二步:创建服务器类:继承大法好2.3 ▶ 第三步:启动服务的仪式感三、高级玩法:让服务器不再单调3.1 🔥 场景1:变身文件服务器3.2 �…...
PyCharm 无法识别 Conda 环境的解决方案
一、问题分析 当在最新版 PyCharm (2024.3) 中配置 Conda 环境时,可能会出现以下典型错误: 找不到 Conda 可执行文件 我在网上找了很多解决办法,都没有有效解决这个问题,包括将环境路径替换为 .bat 文件和查找 python.exe 文件…...
AutoGen学习笔记系列(一)Tutorial - Model
这个系列文章记录了学习微软 AutoGen 的过程,与 smolagents 学习笔记系列一样,仍然以官方教程自己的理解为主线,中间可能穿插几个番外支线的形式写博客。 【注意】:在阅读这篇文章之前需要确保已经按照其 Installation 小节完成必…...
利用Git和wget批量下载网页数据
一、Git的下载(参考文章) 二. wget下载(网上很多链接) 三、git和wget结合使用 1.先建立一个文本,将代码写入文本(代码如下),将txt后缀改为sh(download_ssebop.sh…...
多线程JUC(一)
目录 前言一、多线程的三种实现方式1.继承Thread类2.实现Runnable接口3.利用Callable接口和Future接口4.三种方式对比 二、常见的成员方法1.getName、setName、currentThread、sleep2.线程的优先级3.守护线程4.插入线程 三、线程安全1.线程的生命周期2.同步代码块3.同步方法4.l…...