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

机器学习周报-文献阅读

文章目录

    • 摘要
    • Abstract
  • 1 相关知识
    • 1.1 WDN建模
    • 1.2 掩码操作(Masking Operation)
  • 2 论文内容
    • 2.1 WDN信息的数据处理
    • 2.2 使用所收集的数据构造模型
      • 2.2.1 Gated graph neural network
      • 2.2.2 Masking operation
      • 2.2.3 Training loss
      • 2.2.4 Evaluation metrics
    • 2.3 结果和讨论
      • 2.3.1 Masking operation对模型精度的影响
      • 2.3.2 节点级预测精度
      • 2.3.3 不同传感器放置策略对预测精度的影响
  • 3 相关代码
    • 总结

摘要

本周阅读了一篇在稀疏监测数据下基于图神经网络的给水管网水质实时预测论文,文章提出了一种新的门控图神经网络(GGNN)模型用于水分配网络(WDNs)的实时水质预测。该模型整合水力流向和水质数据,采用掩蔽操作提高预测精度。通过实际WDN评估,GGNN模型能在整个网络实现准确水质预测,基于水质的传感器放置可提高预测精度,此研究为WDN建模中用机器学习模型替代水力模型迈出第一步。同时,结合论文相关知识对掩码操作和GRU原理和代码进行补充学习。

Abstract

This week, I read a paper on real-time water quality prediction in water distribution networks (WDNs) based on graph neural networks under sparse monitoring data. The paper proposes a novel Gated Graph Neural Network (GGNN) model for real-time water quality prediction in WDNs. The model integrates hydraulic flow direction and water quality data and employs a masking operation to improve prediction accuracy. Through evaluation on a real WDN, the GGNN model can achieve accurate water quality prediction across the entire network. The placement of water quality sensors can enhance the prediction accuracy. This study takes the first step in replacing hydraulic models with machine learning models in WDN modeling. In addition, I supplemented my learning on masking operations and the principles and code of GRU based on the relevant knowledge in the paper.

1 相关知识

1.1 WDN建模

供水管网(Water Distribution Network)建模,供水管网是城市供水系统的重要组成部分,其建模的目的是通过数学和计算方法来模拟和分析管网中的水力行为,包括水流、压力分布、水质传输等。以下是WDN建模的一些关键内容:
水力模型: 模拟管网中的水流和压力分布。常用的工具有EPANET,它是一个广泛应用于水力模拟的软件,可以处理稳态和瞬态模拟
水质模型: 用于模拟水质在管网中的传输和变化。近年来,机器学习方法也被引入到水质预测中
拓扑结构: 通过图论方法表示管网的连接关系,包括节点(如水库、储罐、用户节点)和边(如管道、阀门、泵站)

1.2 掩码操作(Masking Operation)

掩码操作(Masking Operation)是一种在机器学习和深度学习中常用的技术,主要用于在训练过程中隐藏或过滤部分输入数据,以增强模型的泛化能力和鲁棒性。其基本思想是在训练过程中随机隐藏部分输入数据,让模型通过上下文信息来预测被隐藏的部分。这种技术可以防止模型过度依赖有限的输入数据,从而提升模型的泛化能力

在机器学习中,掩码操作常用于处理稀疏数据或模拟数据缺失的情况。例如,在图神经网络(GNN)中,掩码操作可以隐藏部分节点的输入数据,让模型学习如何利用已知节点的信息来预测未知节点的状态。

在供水管网(WDN)建模中,掩码操作被用于增强模型对未监测节点的预测能力。具体方法是:在训练过程中,随机选择一定比例的传感器节点,并将其输入替换为零,从而模拟未监测节点的情况。 这种方法不仅提高了模型的泛化能力,还防止了过拟合

在实际应用中,掩码操作可以通过以下步骤实现:

  1. 选择掩码比例: 根据任务需求,随机选择一定比例的输入数据进行掩码。
  2. 应用掩码: 将选定的数据替换为零或其他占位符
  3. 训练模型: 在掩码数据上训练模型,让模型学习如何利用上下文信息进行预测

掩码操作是一种强大的技术,能够显著提升模型在处理稀疏数据和复杂任务时的性能。它在图神经网络、自然语言处理和供水管网建模中的应用展示了其广泛的应用前景

2 论文内容

论文题目:Real-time water quality prediction in water distribution networks using graph neural networks with sparse monitoring data
期刊:Water Research
中科院分区:环境科学与生态学1区

现有问题:

  1. 现有的基于水力模型的系统状态预测方法在有限的传感器数据和密集的计算要求下面临模型校准的挑战
  2. 当前的机器学习模型缺乏预测未被监测或未被包括在模型训练中的站点处的系统状态的能力

创新点:论文提出了一种新的门控图神经网络(GGNN)模型,用于WDN中的实时水质预测。
GGNN模型集成了水流方向和水质数据来表示拓扑结构和系统动力学,并采用掩蔽操作进行训练以提高预测精度。

2.1 WDN信息的数据处理

GGNN模型需要两种类型的数据:WDN拓扑和传感器监测站的历史水质监测数据。

在这里插入图片描述

假设WDN包括n个节点和m个管道,在 N s N_s Ns个传感器站处监测水质。网络拓扑由图G =(V,E)表示,其中V表示包括水库、罐和接头的节点集,并且E表示包括管道、阀门和泵的边集。网络的流向信息和空间拓扑细节通常可以从EPANET等水力模型中获得。利用这些数据构造有向图的邻接矩阵 A ∈ R n × n A\in R^{n×n} ARn×n,其中每个元素 A i j A_{ij} Aij表示水是否从节点 i i i 流向节点 j j j A i j A_{ij} Aij= 1)或不流向节点j( A i j A_{ij} Aij= 0)

其中,数据采集过程包括在指定的时间窗口(表示为 T c T_c Tc)内捕获水质测量值,该时间窗口表示过去收集的历史数据的持续时间。然后将收集的数据用作数据集中被监控节点的节点属性,对于未监控节点,可以将空值替换为0,从而得到节点属性 X ∈ R n × N c X\in R^{n×N_c} XRn×Nc。其中 N c N_c Nc表示在数据收集周期 T c T_c Tc期间获得的水质测量值的数量,其对应于指定时间窗口内的时间步长的数量。它可以作为预测下一个时间步的水质所需的数据大小的指标。

2.2 使用所收集的数据构造模型

2.2.1 Gated graph neural network

在这里插入图片描述
图中:n表示图大小, N c N_c Nc表示节点属性大小, M M M表示隐藏状态大小

第一步: 扩展邻接矩阵 A ∈ R n × n A\in R^{n×n} ARn×n 来准备输入,在有向图中包含双向信息流。通过将A与其转置连接,从而形成扩展邻接矩阵 A ^ = [ A , A T ] \hat{A} = [A,A^T] A^=[A,AT]。同时考虑入边和出边, A ^ ∈ R n × 2 n \hat{A} \in R^{n×2n} A^Rn×2n捕捉节点间的复杂关系和消息传播方向,从而增强了GGNN的双向学习能力。
第二步: 节点 v x v v x_v vxv的节点属性经由具有整流线性单元(ReLU)激活函数的标准线性组合被映射到从原始空间 R N c R^{N_c} RNc到新空间 R M R^M RM的原始隐藏状态 h v ( 0 ) h_v^{(0)} hv(0)。这个映射过程有效地扩大了节点属性的大小,允许GGNN捕获节点属性之间潜在的重要非线性关系。由M表示的隐藏状态的大小是确定模型容量的超参数。

第三步: GGNN将扩展邻接矩阵 A ^ = [ A , A T ] \hat{A} = [A,A^T] A^=[A,AT]和映射的节点属性 h ( 0 ) h^{(0)} h(0)作为输入,在固定的K步上递归计算节点状态,以产生最终的状态矩阵 h ( K ) ∈ R n × M h_{(K)}\in R^{n×M} h(K)Rn×M。GGNN中的节点状态更新过程包括两个基本步骤:聚合和传播
在聚合期间,使用扩展邻接矩阵 A ^ \hat A A^来计算聚合向量 a v a_v av,聚合向量 a v a_v av表示节点v的其相邻节点的状态的聚合。使用以下等式来计算聚合向量:

在这里插入图片描述

其中其中上标k表示时间步长, A v ∈ R n × 2 A_v\in R^{n×2} AvRn×2 是块A中对应于节点v的两列,b表示偏置向量。

在聚合步骤之后,传播步骤采用门控递归单元(GRU)机制来更新节点状态。 GRU传播方程可以描述如下:
在这里插入图片描述

其中,r和z是重置门和更新门 W r W_r Wr W z W_z Wz W W W and U r U_r Ur U z U_z Uz U U U是每层的权重和偏置; σ ( ⋅ ) \sigma(·) σ()是sigmoid激活函数; 是逐元素乘法。

GGNN中的聚合和传播步骤允许模型迭代更新和细化节点状态,合并来自节点先前表示及其相邻节点的信息。这个迭代过程捕获图结构中的动态和交互,使GGNN能够学习和表示节点之间的复杂关系和依赖关系。传播步数K决定了GGNN中信息传播的深度。当K = 1时,每个节点只能从其直接相邻节点学习。随着K的增加,GGNN可以从K步之外的节点捕获信息,包括它们的间接连接。K的选择影响模型的学习能力和效率。较高的K值会导致训练速度较慢,内存需求增加,而较低的K值会限制每个节点可以学习的依赖关系数量。因此,K的选择应该在模型性能和计算效率之间取得平衡。

在使用GRU模块更新节点状态之后,使用线性层将更新的状态 h ( K ) h^{(K)} h(K)转换为表示每个节点的预测状态的 Y ^ ∈ R n \hat Y \in R^n Y^Rn。在这项研究中,节点属性是历史水质浓度数据,其预测状态代表模型对每个节点下一个时间步的水质浓度的预测。这种转换允许模型基于其更新的表示和从邻近的相邻节点传播的信息来生成每个节点处的水质预测。

2.2.2 Masking operation

使用的两个主要目的:

1 它在训练过程中模拟来自非传感器节点的数据的不可用性,使模型能够泛化到观察到的传感器数据之外,并学习预测未监测节点的值
2 它作为一种正则化技术,防止模型仅仅依赖于有限的传感器输入。通过鼓励模型捕捉传感器节点和未监测节点之间的关系,它促进了更好的泛化,并降低了过拟合的可能性。

需要研究屏蔽节点的比例,因为它平衡了模型性能和过拟合。更高的利率减少了可用的信息,增加了适应不足的风险。较低的速率提供更多的信息,但可能导致过拟合。仔细的考虑对于选择最佳的泛化掩蔽率和避免过拟合是至关重要的。

2.2.3 Training loss

作者使用平均绝对误差(MAE)作为训练损失函数。它测量传感器节点的预测和真实水质值之间的平均绝对差。训练损失(L)计算如下:
在这里插入图片描述

其中, N s N_s Ns是传感器节点的数量, T t r a i n T_{train} Ttrain是训练数据集中的时间步长的总数。 y ^ i t \hat{y}_i^t y^it y i t y_i^t yit是在时间步 t t t处具体针对传感器节点 i i i的预测的和真实的水质值。

2.2.4 Evaluation metrics

在应用阶段,不需要Masking operation,因为模型直接预测水质值。经过训练的GGNN模型用于预测整个WDN中所有节点的水质。具体而言,它利用在 T c T_c Tc的时间段内收集的历史水质数据来预测下一个时间步长的水质。使用两个广泛使用的指标来评估GGNN模型的性能:MAE和平均绝对百分比误差(MAPE)。

在这里插入图片描述

其中,N是WDN中的节点数量, T t e s t T_{test} Ttest是测试数据集中的时间步的总数, y ^ i t \hat{y}_i^t y^it y i t y_i^t yit是节点 i i i在时间步 t t t处的预测和真实水质值。

2.3 结果和讨论

2.3.1 Masking operation对模型精度的影响

作者对各种不同掩蔽操作对GGNN模型预测精度的影响做出对比。进行了10次实验运行,包括未掩蔽训练和掩蔽比范围为0.1 - 0.9的训练。在不同的训练时期,将整个网络中所有954个节点(包括2个水源和952个需求节点)的MAE用作评估度量。下图显示了在不同掩蔽条件和训练时期下模型的MAE结果。结果表明,所有掩蔽比的性能始终优于未掩蔽模型,表明掩蔽操作在提高预测精度方面的有效性。
在这里插入图片描述
将水质数据集分为五个子集,每个子集用作测试集一次,而其余子集用于训练。计算各掩码条件下的MAE,得到各掩码比的5组MAE值。如图显示了30个训练epoch后不同掩码条件下的MAE结果的箱形图,提供了对每个掩码比下模型准确度的分布和变异性的了解。研究结果表明,过小或过大的掩蔽比导致次优的模型性能。当掩蔽比设置为0.5时,该模型达到了最高的准确度,这表明适度的掩蔽比在捕获相关信息和减轻过拟合之间取得了平衡。实验结果突出了采用适当的掩蔽比在增强水质预测使用GGNN模型的有效性。这些发现强调了该模型在WDNs建模中作为一种有价值的水质预测工具的潜力。

在这里插入图片描述

2.3.2 节点级预测精度

尽管传感器数据的可用性有限,但该模型仍能够对相当多的节点实现高预测精度;如图为测试实验中各个节点的氯预测误差(std代表MAE的标准差)。模型在大多数节点上表现出良好的预测能力,约三分之二的节点MAPE低于10%。尽管传感器数据有限,模型仍能准确预测大部分节点的水质。此外,模型的预测准确性与节点到传感器的距离无关,表明模型能够有效利用网络拓扑信息进行预测。

在这里插入图片描述

如图为:距离最近传感器不同距离的节点的MAE的分布。红色叉号详细说明了落在给定邻近级别内的节点数量。该模型的预测精度不会根据节点和传感器之间的距离而显著变化。这表明该模型能够从相邻节点捕获相关信息,即使它们相对较远。

在这里插入图片描述

2.3.3 不同传感器放置策略对预测精度的影响

研究比较了基于介数中心性(Betweenness Centrality,基于拓扑信息)和方差分析(ANOVA,整合水质数据)的传感器布局策略。结果表明,基于水质信息的ANOVA方法在预测准确性上优于仅基于拓扑信息的介数中心性方法。此外,传感器数量的增加并不总是能提高预测准确性,而是需要合理布局。

在这里插入图片描述

表1中的结果表明了ANOVA策略在预测准确性方面的优越性,强调了在传感器放置中纳入水质信息的重要性。传感器数量和精度之间的关系遵循非线性趋势。随着传感器从20个增加到30个,方差分析策略最初会提高准确性。进一步的增量会产生递减的回报,甚至在精度上略有下降,这表明最佳的传感器数量对应最大化的预测精度。方差分析策略始终优于介数中心性策略,突出了在传感器放置决策中整合水质数据的价值。考虑水质信息的传感器部署提高了WDNs的预测精度。这些发现有助于有效的传感器放置策略,提升网络的监测和管理。

同时发现随着传感器数量的增加(>30),该指数呈下降趋势。此外,与使用30个传感器相比,使用60个传感器导致较低的预测精度。这表明,由聚类驱动的传感器放置策略的有效性并不一定与传感器的数量呈线性关系。一旦通过特定数量的传感器实现了最佳放置策略,进一步的增量可能不会显着提高模型的性能。即传感器的位置对预测精度的影响比部署的传感器的数量更大。

3 相关代码

手写逐行实现GRU网络

import torch
import torch.nn as nn#逐行实现GRU网络
def gru_forward(input,initial_states,w_ih,w_hh,b_ih,b_hh):prev_h= initial_statesbs,T,i_size=input.shapeh_size=w_ih.shape[0]//3#对权重扩维,复制成batch_size倍batch_w_ih=w_ih.unsqueeze(0).tile(bs,1,1)batch_w_hh=w_hh.unsqueeze(0).tile(bs,1,1)output=torch.zeros(bs,T,h_size)#GRU网络的输出状态序列for t in range(T):x=input[:,t,:]#t时刻GRU ce1l的输入特征向量,[bs,i_size]w_times_x=torch.bmm(batch_w_ih,x.unsqueeze(-1))#[bs,3*h_size,1]w_times_x=w_times_x.squeeze(-1)#[bs,3*h size]w_times_h_prev=torch.bmm(batch_w_hh,prev_h.unsqueeze(-1))#[bs,3*h_size,1]w_times_h_prev=w_times_h_prev.squeeze(-1)   #[bs,3*h_size]r_t=torch.sigmoid(w_times_x[:,:h_size]+w_times_h_prev[:,:h_size]+b_ih[:h_size]+b_hh[:h_size]) #重置门z_t=torch.sigmoid(w_times_x[:,h_size:2*h_size]+w_times_h_prev[:,h_size:2*h_size]+b_ih[h_size:2*h_size]+b_hh[h_size:2*h_size])#更新门n_t=torch.tanh(w_times_x[:,2*h_size:3*h_size]+b_ih[2*h_size:3*h_size]+r_t*(w_times_h_prev[:,2*h_size:3*h_size]+b_hh[2*h_size:3*h_size]))#候选状态prev_h=(1-z_t)*n_t+z_t*prev_h #增量更新得到当前时刻最新隐含状态output[:,t,:]=prev_hreturn output,prev_h#测试函数的正确性
bs,T,i_size,h_size=2,3,4,5
input=torch.randn(bs,T,i_size)#输入序列
h0=torch.randn(bs,h_size)#初始值,不需要训练#调用PyTorch官方GRU API
gru_layer =nn.GRU(i_size,h_size,batch_first=True)
output,h_final=gru_layer(input,h0.unsqueeze(0))
#print(output)
for k,v in gru_layer.named_parameters():print(k,v.shape)
#调用自定义的gru forward函数
output_custom, h_final_custom=gru_forward(input,h0,gru_layer.weight_ih_l0,gru_layer.weight_hh_l0,gru_layer.bias_ih_l0,gru_layer.bias_hh_l0)
print(torch.allclose(output,output_custom))
print(torch.allclose(h_final,h_final_custom))

掩码操作(Masking Operation)代码:
在训练过程中随机掩码(隐藏)部分输入数据,只在训练模式下应用掩码操作,部分输入数据会被随机掩码为0在评估模式下,输入数据保持不变(保留原始输入)

import torch
import torch.nn as nnclass MaskingOperation(nn.Module):"""掩码操作模块,用于在训练过程中随机掩码部分输入数据。"""def __init__(self, mask_ratio=0.5):"""初始化掩码操作模块。:param mask_ratio: 掩码比例,表示需要掩码的数据比例(0到1之间)。"""super(MaskingOperation, self).__init__()self.mask_ratio = mask_ratiodef forward(self, x):"""前向传播函数,随机掩码输入数据的一部分。:param x: 输入张量,形状为 (batch_size, num_nodes, features)。:return: 掩码后的输入张量。"""if self.training:  # 只在训练模式下应用掩码操作batch_size, num_nodes, _ = x.size()# 随机生成掩码矩阵,形状与输入数据一致mask = torch.rand(batch_size, num_nodes, 1, device=x.device) < self.mask_ratio# 将掩码位置的值替换为0x_masked = torch.where(mask, torch.zeros_like(x), x)return x_maskedelse:# 在评估模式下直接返回原始输入return x# 示例:使用掩码操作模块
if __name__ == "__main__":# 设置随机种子以保证结果可复现torch.manual_seed(42)# 创建掩码操作模块,掩码比例为0.5masking_op = MaskingOperation(mask_ratio=0.5)# 创建一个示例输入张量,形状为 (batch_size=2, num_nodes=4, features=3)example_input = torch.tensor([[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0, 11.0, 12.0]],[[13.0, 14.0, 15.0], [16.0, 17.0, 18.0], [19.0, 20.0, 21.0], [22.0, 23.0, 24.0]]], dtype=torch.float32)print("原始输入数据:")print(example_input)# 将掩码操作模块设置为训练模式masking_op.train()masked_input = masking_op(example_input)print("\n训练模式下掩码后的输入数据:")print(masked_input)# 将掩码操作模块设置为评估模式masking_op.eval()masked_input_eval = masking_op(example_input)print("\n评估模式下掩码后的输入数据:")print(masked_input_eval)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

文章为WDN水质预测提供新的机器学习方法,解决传感器数据有限和网络复杂的挑战。阅读本篇论文,同时,我对图神经网络在水分配网络中的应用有了深入的了解,并掌握了掩码操作和GRU的基本原理和应用方法。

相关文章:

机器学习周报-文献阅读

文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作&#xff08;Masking Operation&#xff09; 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…...

TensorFlow实现逻辑回归模型

逻辑回归是一种经典的分类算法&#xff0c;广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型&#xff0c;并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先&#xff0c;我们准备两类数据点&#xff0c;分别表示两个不同…...

06-AD向导自动创建P封装(以STM32-LQFP48格式为例)

自动向导创建封装 自动向导创建封装STM32-LQFP48Pin封装1.选则4排-LCC或者QUAD格式2.计算焊盘相定位长度3.设置默认引脚位置(芯片逆时针)4.特殊情况下:加额外的标记 其他问题测量距离:Ctrl M测量 && Ctrl C清除如何区分一脚和其他脚?芯片引脚是逆时针看的? 自动向导…...

《 C++ 点滴漫谈: 二十四 》深入 C++ 变量与类型的世界:高性能编程的根基

摘要 本文深入探讨了 C 中变量与类型的方方面面&#xff0c;包括变量的基本概念、基本与复合数据类型、动态类型与内存管理、类型推导与模板支持&#xff0c;以及类型系统的高级特性。通过全面的理论讲解与实际案例分析&#xff0c;展示了 C 类型系统的强大灵活性与实践价值。…...

Ceph:关于Ceph 中 RADOS 块设备快照克隆管理的一些笔记整理(12)

写在前面 准备考试,整理 ceph 相关笔记博文内容涉及使用 RADOS 块设备提供 RDB 的快照和克隆如何操作理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想…...

C语言连接Mysql

目录 C语言连接Mysql下载 mysql 开发库 方法介绍mysql_init()mysql_real_connect()mysql_query()mysql_store_result()mysql_num_fields()mysql_fetch_fields()mysql_fetch_row()mysql_free_result()mysql_close() 完整代码 C语言连接Mysql 下载 mysql 开发库 方法一&#xf…...

2023CISCN初赛unzip

2023CISCN初赛unzip 随便上传一个文件&#xff0c;会自动跳转到uplaod.php目录下,源码如下&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); if (finfo_file($finfo, $_FILES["file"]["tmp_name…...

Elasticsearch的索引生命周期管理

目录 零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的&#xff1f;如何监控和调整Elasticsearch ILM策略的性能&#xff1f; 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整ILM策…...

检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作

联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 &#xff08;不是点击了什么鼠标外加按键&#xff0c;这个鼠标除了左右和中间滚轮&#xff0c;没有其他按键了&#xff09;...

2024年记 | 凛冬将至

放弃幻想&#xff0c;准备斗争&#xff01; 考研or就业&#xff1f; 上大学以来&#xff0c;考研上名校在我的心里一直是一颗种子&#xff0c;2024年初&#xff0c;当时的想法是考研和就业两手抓。买了张宇的高数现代&#xff0c;想要死磕&#xff01; 也记了挺多笔记... 如果…...

【Java-数据结构】Java 链表面试题下 “最后一公里”:解决复杂链表问题的致胜法宝

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 引言&#xff1a; Java链表&#xff0c;看似简单的链式结构&#xff0c;却蕴含着诸多有趣的特性与奥秘&#xff0c;等待我们去挖掘。它就像一…...

vim如何解决‘’文件非法关闭后,遗留交换文件‘’的问题

过程描述&#xff1a; 由于我修改文件时&#xff08;一定得修改了文件&#xff0c;不做任何修改不会产生这个问题&#xff09;的非法关闭&#xff0c;比如直接关闭虚拟机&#xff0c;或者直接断开远程工具的远程连接&#xff0c;产生了以下遗留交换文件的问题&#xff1a; 点击…...

国内优秀的FPGA设计公司主要分布在哪些城市?

近年来&#xff0c;国内FPGA行业发展迅速&#xff0c;随着5G通信、人工智能、大数据等新兴技术的崛起&#xff0c;FPGA设计企业的需求也迎来了爆发式增长。很多技术人才在求职时都会考虑城市的行业分布和发展潜力。因此&#xff0c;国内优秀的FPGA设计公司主要分布在哪些城市&a…...

运用python爬虫爬取汽车网站图片并下载,几个汽车网站的示例参考

当然&#xff0c;以下是一些常见的汽车网站及其爬虫示例代码&#xff0c;展示如何爬取汽车图片并下载。请注意&#xff0c;爬取网站内容时应遵守网站的使用协议和法律法规&#xff0c;避免对网站造成不必要的负担。 示例1&#xff1a;爬取汽车之家图片 网站地址 汽车之家 爬…...

IO进程寒假作业DAY6

请使用互斥锁 和 信号量分别实现5个线程之间的同步 使用互斥锁 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include &…...

C++ 中用于控制输出格式的操纵符——setw 、setfill、setprecision、fixed

目录 四种操纵符简要介绍 setprecision基本用法 setfill的基本用法 fixed的基本用法 setw基本用法 以下是一些常见的用法和示例&#xff1a; 1. 设置字段宽度和填充字符 2. 设置字段宽度和对齐方式 3. 设置字段宽度和精度 4. 设置字段宽度和填充字符&#xff0c;结合…...

solidity高阶 -- 线性继承

Solidity是一种面向合约的高级编程语言&#xff0c;用于编写智能合约。在Solidity中&#xff0c;多线继承是一个强大的特性&#xff0c;允许合约从多个父合约继承属性和方法。本文将详细介绍Solidity中的多线继承&#xff0c;并通过不同的实例展示其使用方法和注意事项。 在Sol…...

PydanticAI应用实战

PydanticAI 是一个 Python Agent 框架,旨在简化使用生成式 AI 构建生产级应用程序的过程。 它由 Pydantic 团队构建,该团队也开发了 Pydantic —— 一个在许多 Python LLM 生态系统中广泛使用的验证库。PydanticAI 的目标是为生成式 AI 应用开发带来类似 FastAPI 的体验,它基…...

Leecode刷题C语言之跳跃游戏②

执行结果:通过 执行用时和内存消耗如下&#xff1a; int jump(int* nums, int numsSize) {int position numsSize - 1;int steps 0;while (position > 0) {for (int i 0; i < position; i) {if (i nums[i] > position) {position i;steps;break;}}}return steps…...

fpga学习入门 串口rs232回环

奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试&#xff0c;top文件写的方式就是将rx&#xff08;fpga端&#xff09;接受到的模块&#xff08;pc端&#xff09;tx发送出去&#xff0c;这两个端口用杜邦线连接&#xff0c;同理模块的rx连接fpga的tx&#xff0c;…...

单片机基础模块学习——DS18B20温度传感器芯片

不知道该往哪走的时候&#xff0c;就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚&#xff0c;分别为 GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议 优点&#xff1a;占用端口少&#xff0c;电路设计方便 同时该协议要求通过上拉电阻…...

C基础寒假练习(4)

输入带空格的字符串&#xff0c;求单词个数、 #include <stdio.h> // 计算字符串长度的函数 size_t my_strlen(const char *str) {size_t len 0;while (str[len] ! \0) {len;}return len; }int main() {char str[100];printf("请输入一个字符串: ");fgets(…...

es6.7.1分词器ik插件安装-和head插件连接es特殊配置

es6.7.1分词器ik插件安装-和head插件连接es特殊配置 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 1.查看es6.7.1和es-head安装位置和es插件路径 [ro…...

Luzmo 专为SaaS公司设计的嵌入式数据分析平台

Luzmo 是一款嵌入式数据分析平台&#xff0c;专为 SaaS 公司设计&#xff0c;旨在通过直观的可视化和快速开发流程简化数据驱动决策。以下是关于 Luzmo 的详细介绍&#xff1a; 1. 背景与定位 Luzmo 前身为 Cumul.io &#xff0c;专注于为 SaaS 公司提供嵌入式分析解决方案。…...

菜鸟之路Day10一一集合进阶(三)

菜鸟之路Day10一一集合进阶&#xff08;三&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.1.28 文章目录 菜鸟之路Day10一一集合进阶&#xff08;三&#xff09;0.概述1.双列集合概述2.Map2.1Map的常见API2.2Map的遍历方式 3.HashMap4.LinkedHashMap5.TreeMap 0.概…...

Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓

Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓 1.SDK解压到家目录下的 rk3588_android_sdk 目录 一. 全部编译 ###执行 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib gmultilib…...

Workerman和Swoole有什么区别

Workerman和Swoole都是PHP的socket服务器框架&#xff0c;它们之间存在一些显著的区别&#xff0c;主要体现在以下几个方面&#xff1a; 一、实现语言与性能 Workerman&#xff1a;使用纯PHP实现。由于PHP本身的性能限制&#xff0c;Workerman在某些方面可能不如C语言实现的框…...

MySQL(1)

数据库 基础篇 MYSQL概述 SQL 函数 约束 多表查询 事务 进阶篇 存储索引 索引 SQL优化 试图/存储过程/触发器 锁 InnoDB核心 MySQL管理 运维篇 日志 主从复制 分库本表 读写分离 基础篇 MySQL 数据库概念&#xff1a;存储数据的仓库&#xff0c;数据是有…...

DeepseekMath:超强开源数学模型(论文详解)

摘要 近日&#xff0c;中国团队Deepseek推出了一款名为DeepSeekMath的7B开源数学模型&#xff0c;这个模型在数学方面的表现令人惊叹。DeepSeekMath 7 B在不依赖外部工具包和投票技术的情况下&#xff0c;在竞赛级MATH基准测试中获得了51.7%的分数&#xff0c;接近Gemini-Ultr…...

OpenCSG月度更新2025.1

1月的OpenCSG取得了一些亮眼的成绩 在2025年1月&#xff0c;OpenCSG在产品和社区方面继续取得了显著进展。产品方面&#xff0c;推出了AutoHub浏览器自动化助手&#xff0c;帮助用户提升浏览体验&#xff1b;CSGHub企业版功能全面升级&#xff0c;现已开放试用申请&#xff0c…...

简易CPU设计入门:控制总线的剩余信号(四)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…...

scrol家族 offset家族 client家族学习

Scroll 系列属性 scrollTop & scrollLeft scrollTop: 返回元素的内容已向上滚动的部分的高度。scrollLeft: 返回元素的内容已向左滚动的部分的宽度。 scrollHeight & scrollWidth scrollHeight: 返回元素的实际高度&#xff0c;包括由于溢出而在屏幕上不可见的内容…...

人工智能发展历程

AI 发展历史时间表 1943年&#xff0c;美国神经科学家沃伦斯特麦卡洛克和逻辑学家沃尔特皮茨提出了神经元的数学模型&#xff0c;第一个神经元的数学模型- MP 模型。为现代人工智能学科的建立奠定了基础。1950年&#xff0c;艾伦图灵提出了著名的“图灵测试”&#xff0c;使得…...

vim交换文件的工作原理

在vim中&#xff0c;交换文件是一个临时文件&#xff0c;当我们使用vim打开一个文件进行编辑&#xff08;一定得是做出了修改才会产生交换文件&#xff09;时候&#xff0c;vim就会自动创建一个交换文件&#xff0c;而之后我们对于文件的一系列修改都是在交换文件中进行的&…...

利用 PyTorch 动态计算图和自动求导机制实现自适应神经网络

在深度学习任务中&#xff0c;不同任务的复杂度千差万别。为了解决复杂任务对模型容量的需求&#xff0c;同时避免简单任务因过度拟合导致的性能下降&#xff0c;我们可以构建一个能够根据任务自动调整网络结构的神经网络。在 PyTorch 中&#xff0c;动态计算图和自动求导机制为…...

docker如何查看容器启动命令(已运行的容器)

docker ps 查看正在运行的容器 该命令主要是为了详细展示查看运行时的command参数 # 通过docker --no-trunc参数来详细展示容器运行命令 docker ps -a --no-trunc | grep <container_name>通过docker inspect命令 使用docker inspect&#xff0c;但是docker inspect打…...

学历赋

崇岳北峙&#xff0c;紫气东临&#xff1b;学海横流&#xff0c;青云漫卷。连九陌而贯八荒&#xff0c;纳寒门而载贵胄。墨池泛舟&#xff0c;曾照匡衡凿壁之光&#xff1b;杏坛飞絮&#xff0c;犹闻仲尼弦歌之音。然观当下&#xff0c;黉宇接天如笋立&#xff0c;青衫叠浪似云…...

vue和reacts数据响应式的差异

Vue 的数据响应式&#xff1a; 原理&#xff1a; Vue 使用 Object.defineProperty 或 Proxy&#xff08;在 Vue 3 中&#xff09;来实现数据的响应式。当创建 Vue 实例时&#xff0c;会对 data 对象中的属性进行遍历&#xff0c;将其转换为响应式属性。对于 Object.definePro…...

doris: MAP数据类型

MAP<K, V> 表示由K, V类型元素组成的 map&#xff0c;不能作为 key 列使用。 目前支持在 Duplicate&#xff0c;Unique 模型的表中使用。 K, V 支持的类型有&#xff1a; BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DECIMALV3, DAT…...

在计算机上本地运行 Deepseek R1

Download Ollama on Linux Download Ollama on Windows Download Ollama on macOS Deepseek R1 是一个强大的人工智能模型&#xff0c;在科技界掀起了波澜。它是一个开源语言模型&#xff0c;可以与 GPT-4 等大玩家展开竞争。但更重要的是&#xff0c;与其他一些模型不同&…...

LeetCode 16. 排列序列

思路 排序数组&#xff1a;对数组进行从小到大排序。 遍历固定一个元素&#xff1a;遍历数组中的每个元素作为三个数中的第一个数&#xff0c;固定该元素后&#xff0c;使用双指针在剩余的子数组中寻找另外两个数。 双指针逼近target&#xff1a;对于每个固定的元素&#xff…...

【C++高并发服务器WebServer】-9:多线程开发

本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…...

全解:Redis RDB持久化和AOF持久化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM

Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …...

LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145356022 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...

Python帝王學集成-母稿

引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…...

MySQL数据导入与导出

在现代软件开发中,数据管理是一个重要的核心环节,而数据库则是进行数据管理的主要工具。MySQL 作为一款开源的关系型数据库管理系统,被广泛应用于企业和个人开发项目中。对于学习编程的初学者或是自学者来说,掌握 MySQL 的基本操作尤为重要,尤其是数据的导入与导出功能。这…...

微服务面试题:概览

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

每日一题 430. 扁平化多级双向链表

430. 扁平化多级双向链表 简单 /*class Solution { public:Node* flatten(Node* head) {Node* tail nullptr;return dfs(head);}Node* dfs(Node* head){Node* cur head;while(cur ! nullptr){if(cur->child ! nullptr){Node* curChild getTail(cur->child);Node* te…...

冯诺依曼系统及操作系统

目录 一.冯诺依曼体系结构 二.操作系统 三.系统调用和库函数概念 一.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一…...