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

【图神经网络】用PyG实现图机器学习的可解释性

Graph Machine Learning Explainability with PyG

  • 框架总览
    • 示例:解释器
    • The Explanation Class
    • The Explainer Class and Explanation Settings
    • Explanation评估
    • 基准数据集
    • Explainability Visualisation
    • 实现自己的ExplainerAlgorithm
    • 对于异质图的扩展
    • 解释链路预测
  • 总结
  • 参考文献

图神经网络(Graph Neural Networks,简称GNNs)在处理图结构数据(例如社交网络、分子图和知识图谱)方面越来越受欢迎。然而,基于图的数据的复杂性以及图中节点之间的非线性关系可能会导致理解GNN为何作出特定预测变得困难。随着图神经网络的普及,对解释其预测的兴趣也越来越大。

在实际机器学习应用中,解释的重要性不可低估。解释帮助建立模型的信任和透明度,用户可以更好地理解预测是如何生成以及影响预测的因素。它们提高决策制定的质量,决策者可以更好地理解模型预测的基础上做出更明智的决策。解释还使从业者更容易调试和改进他们开发的模型的性能。在某些领域,如金融和医疗保健,由于合规性和法规要求,解释甚至可能是必需的。

在图机器学习中,解释仍然是一项持续的研究工作,图上的可解释性不如计算机视觉或自然语言处理等其他子领域的解释成熟。此外,由于GNN在复杂的关系数据上操作,解释本身也有所不同:

  • 上下文理解(Contextual Understanding):解释需要对图中节点之间的关系和实体进行上下文理解,这可能很复杂,也很难理解;
  • 动态关系(Dynamic relationships):图中节点之间的关系可能会随着时间的推移而变化,因此很难为不同时间点的预测提供解释;
  • 异质数据(Heterogeneous Data):GML通常涉及处理具有复杂特征的异构数据类型,这使得很难提供统一的解释方法;
  • 解释粒度(Explanation granularity):解释必须解释预测的结构起源,以及特征的重要性。这意味着解释哪些节点、边或子图是重要的,以及哪些节点或边特征对预测结果有很大贡献。

图1
图1 图机器学习中解释的复杂性。左手边显示了用于在节点 v v v进行预测的GNN计算图。计算图中的一些边是重要的神经消息传递路径(绿色),而其他边则不是(橙色)。然而,GNN需要聚合重要和不重要的特征来进行预测,而解释方法的目标是识别一小部分对预测至关重要的重要特征和途径。

除了图形机器学习的困难和复杂性,最近在该领域有很多统一的工作,该作品均旨在为评估解释[1,2]提供统一的框架[1,2],并提供了现有解释动物园的分类法可用的方法[3]。

在最近的社区快速迭代中,PyG社区实现了一个核心的可解释性框架,同时提供了各种评估方法、基准数据集和可视化工具,使得在PyG中开始使用图机器学习解释变得非常简单。此外,该框架既适用于想要直接使用常见图解释器(如GNNExplainer [4]或PGExplainer [5]),也适用于想要实现、测试和评估自己的解释方法的用户。

在本博客文章中,我们将逐步介绍可解释性模块,详细说明框架的每个组件如何工作以及其作用。随后,我们将介绍各种解释评估方法和合成基准数据集,这些方法与数据集相辅相成,确保您为当前任务生成最佳的解释结果。接下来,我们将介绍一些可立即使用的可视化方法。最后,我们将详细介绍在PyG中实现自己的解释方法所需的步骤,并强调异构图和链接预测解释等高级用例的工作。

框架总览

在设计解释性框架时,PyG的目标是设计一个易于使用的解释性模块,该模块:

  • 可以扩展以满足许多GNN应用的要求
  • 可以适应各种类型的图和解释设定
  • 可以提供解释输出,以全面评估和可视化

框架有四个核心概念:

  • 解释器(Explainer)类:一个用于实例级解释的PyG可解释性模块的包装器;
  • 解释(Explanation)类:封装解释程序输出的类
  • 解释器算法(ExplainerAlgorithm)类:解释器使用的解释性算法在给定训练实例的情况下生成解释
  • 度量(metric)包:使用解释(Explanation)输出以及GNN模型 /ground truth的评估指标来评估解释性

图2
图2 PyG可解释框架总览。用户提供explanation settings,以及需要解释的模型和数据。Explainer类是一个PyG实例,封装了一个解释器算法,即特定的解释方法,用于为给定的模型和数据生成解释。解释结果被封装在Explanation类中,可以进行进一步的post-processed、可视化和评估。

现在让我们更深入地了解可用的各种解释设置。

示例:解释器

这里是一个示例Explainer设置,它使用GNNEexplainer对Cora数据集进行模型解释(请参见gnn_Explainer.py示例)。

explainer = Explainer(model=model,algorithm=GNNExplainer(epochs=200),explanation_type='model',node_mask_type='attributes',edge_mask_type='object',model_config=dict(mode='multiclass_classification',task_level='node',return_type='log_probs',),
)

为所有属性设置节点级别掩码,为边设置边作为对象。为了对模型的一个特定预测给出一个解释,我们简单地称之为解释者(explainer):

node_index = 10 # which node index to explain
explanation = explainer(data.x, data.edge_index, index=node_index)

现在让我们来看看所有的螺母和螺栓,它们使PyG中的解释变得如此简单!

The Explanation Class

使用Explanation类来表示解释,该类是一个DataHeteroData对象,其中包含节点、边、特征和数据的任何属性的掩码。在这个范例中,掩码作为相应节点/边/特征的解释归因掩码的值越大,相应组件对解释的重要性就越高(0表示完全不重要)。Explanation类包含获取诱导解释子图的方法,该子图由所有非零解释归因组成,以及解释子图的补集。此外,它还包括用于解释的阈值化和可视化方法。

The Explainer Class and Explanation Settings

Explainer类被设计为处理所有的可解释性settings,这些settings可以作为Explainer的直接参数或者在ModelConfig或ThresholdConfig的配置中设置。这个新接口提供了许多设置选项。

# Explainer Parameters
model: torch.nn.Module,
algorithm: ExplainerAlgorithm,
explanation_type: Union[ExplanationType, str],
model_config: Union[ModelConfig, Dict[str, Any]],
node_mask_type: Optional[Union[MaskType, str]] = None,
edge_mask_type: Optional[Union[MaskType, str]] = None,
threshold_config: Optional[ThresholdConfig] = None,

model可以是我们用来生成解释的任何PyG模型。额外的模型设置在ModelConfig中指定,该设置指定了模式(mode)、任务级别(task_level)和模型的返回类型(return_type)。模式描述了任务类型,例如mode=multiclass-classification;任务级别表示任务级别(节点级、边级或图级任务);返回类型描述了模型的预期返回类型(原始值raws、概率probs或对数概率log_probs)。

说明有两种类型的解释,如explanation_type所示(有关更深入的讨论,请参见[1]):

  • explanation_type='phenomenon'旨在解释为什么要对特定的输入做出特定的决定。我们对数据中从输入到输出的现象感兴趣。在这种情况下,标签被用作解释的目标
  • explanation_type='model'旨在为所提供的模型提供事后解释。在这种设置中,我们试图打开黑盒并解释其背后的逻辑。在这种情况下,模型预测被用作解释的目标

Explanation的精确计算方式由algorithm参数指定,模块中有几个现成的:

  1. GNNExplainer:GNN-Explainer模型来自 “GNNExplainer: Generating Explanations for Graph Neural Networks”论文。
  2. PGExplainer:PGExplainer模型来自“Parameterized Explainer for Graph Neural Network” 论文
  3. AttentionExplainer:使用基于注意力的GNN(例如,GATConv、GATv2Conv或TransformerConv)产生的注意力系数作为边解释的解释器
  4. CaptumExplainer:基于Captum的解释器
  5. GraphMaskExplainer:GraphMask-Explainer来自”Interpreting Graph Neural Networks for NLP With Differentiable Edge Masking“论文(torch_geometry.contrib的一部分)
  6. PGMExplainer:PGMExplainer模型来自”PGMExplainer: Probabilistic Graphical Model Explanations for Graph Neural Networks“论文(torch_geometry.contrib的一部分)

我们还支持许多不同类型的掩码,这些掩码设置为node_mask_typeedge_mask_type,可以是:

  • None没有任何节点/边执行掩码
  • ”object“将会对每个节点/边执行掩码
  • ”common_attributes“将会掩码每个节点特征/边属性
  • ”attributes“将在所有节点/边上分别屏蔽每个节点特征/边属性

图3
图3 Explainer类中提供的不同节点掩码类型

最后,还可以通过ThresholdConfig设置阈值行为。如果不想对解释掩码进行阈值处理,可以将其设置为None;或者,可以在任意值上应用hard阈值;或者,可以仅保留top-k个值(使用topk选项),或者将top-k个值设为1(使用topk_hard选项)。

Explanation评估

生成解释绝不是可解释性工作流程的终点。解释的质量可以通过多种不同的方法进行评估。PyG支持一些开箱即用的解释评估指标,可以在metric包中找到它们。

也许最流行的评估指标是Fidelity+/-(详见1)。Fidelity评估产生的解释子图对初始预测的贡献,可以通过仅将子图提供给模型(fidelity-)或从整个图中移除子图(fidelity+)来进行评估。
Fidelity +/-现象和模型模式的定义
Fidelity +/-现象和模型模式的定义(source [1])

保真度分数(Fidelity scores)表明了可解释模型再现自然现象或GNN模型逻辑的程度。一旦给出了一个解释,就可以获得以下两种信心:

from torch_geometric.explain.metric import fidelity
fid_pm = fidelity(explainer, explanation)

PyG提供表征分数(characterization score)作为将两个Fidelity指标结合为单一度量的手段[1]。此外,如果对许多不同阈值(或熵)的解释都有Fidelity对,可以使用Fidelity曲线下面积(Fidelity curve auc)计算Fidelity曲线下面积。此外,还提供了不忠实(unfaithfulness)度量指标,用于评估解释对底层GNN预测器的忠实程度[6]。

在没有可用的“真实解释”时,诸如忠实度分数和不忠实度量等指标对于评估解释非常有用。即没有一个预先确定的节点/特征/边集合来完全解释特定的模型预测或现象。特别是在开发新的解释算法时,我们可能对在某些标准基准数据集上的性能感兴趣[1,2]。groundtruth_metrics方法比较解释掩码并返回标准度量的选择(”accuracy“,”recall“,”precision“,”f1_score“,”auroc“):

from torch_geometric.explain.metric import groundtruth_metrics
accuracy, auroc = groundtruth_metrics(pred_mask, target_mask, metrics=["accuracy", "auroc"])

当然,以这种方式评估解释器首先需要有ground truth解释的基准数据集。

基准数据集

为了促进新的图解释算法的开发和严格评估,PyG现在提供了几个解释器数据集,例如BA2MotifDatasetBAMultiShapesDatasetInfectionDataset,以及一种创建合成基准数据集的简便方法。通过ExplainerDataset类提供支持,该类通过GraphGenerator创建合成图,并随机附加num_motifs个来自MotifGenerator的模式。基于节点和边是否属于特定模式,给出了节点级和边级的解释能力掩码,作为ground-truth。

当前支持的GraphGenerator有:

  • BAGraph:随机Barabasi-Albert(BA)图
  • ERGraph:随机Erdos-Renyi(ER)图
  • GridGraph:二维网格图

但是也可以自定义,通过创建GraphGenerator的子类。除此之外,对于motifs,支持:

  • HouseMotif:[4]中的House structured motif
  • CycleMotif:[4]中的cycle motif
  • CustomMotif:基于自定义结构从Data对象或networkx.Graph对象添加任何motif的简单方法(例如一个轮子形状)

可以使用上述设置生成的数据集是GNNExplainer[4]、PGExplainer[5]、SubgraphX[8]、PGMExplainer[9]、GraphFramEx[1]等中使用的一类基准数据集的超类(super-class)。
图4
图4 随机图生成器和motif生成器。可以动态生成具有所需种子和大小的新数据集。例如,为了生成基于Barabasi-Albert图的数据集,其中80个house motifs用作ground truth解释标签,我们将使用:

from torch_geometric.datasets import ExplainerDataset
from torch_geometric.datasets.graph_generator import BAGraph
dataset = ExplainerDataset(graph_generator=BAGraph(num_nodes=300, num_edges=5),motif_generator='house',num_motifs=80,
)

BAMultiShapesDataset是用于评估图分类可解释性算法的合成数据集[10]。给定三个原子模式,即House(H)、Wheel(W)和Grid(G),BAMultiShapesDataset包含1,000个Barabasi-Albert图,其标签取决于原子模式的附加方式,如下所示:
BAMultiShapesData集中的类取决于原子基序的存在
数据集是预先计算的,以便与官方实现相一致。

另一个预先计算的数据集是BA2MotifDataset[5]。它包含1,000个Barabasi-Albert图。一半的图附有HouseMotif,剩下的图附有五节点的CycleMotif。根据附加模式的类型,将图分配给两个类别之一。要创建类似的数据集,可以使用带有图和模式生成器的ExplainerDataset。

此外,PyG还提供了InfectionDataset [2]生成器,其中节点预测它们与infected节点(黄色节点)的距离,并使用到infected节点的唯一路径作为解释。非唯一路径到infected节点的节点被排除在外。不可达节点和距离至少为max_path_length的节点被合并为一个类别。
图5
图5 来自[2]的infection dataset

为了生成infection dataset,指定了一个图生成器、感染路径长度和感染节点的数量:

# Generate Barabási-Albert base graph
graph_generator = BAGraph(num_nodes=300, num_edges=500)
# Create the InfectionDataset to the generated base graph
dataset = InfectionDataset(graph_generator=graph_generator,num_infected_nodes=50,max_path_length=3
)

PyG的目标是在未来添加更多的解释数据集和图形生成器。

Explainability Visualisation

如前所述,Explanation类提供了基本的可视化功能,包括两个方法visualize_feature_importance()visualize_graph()

对于可视化特性,我们可以指定使用top_k绘制top特性的数量,或者使用feat_labels传递feature labels。

explanation.visualize_feature_importance(feature_importance.png, top_k=10)

输出被存储到指定的路径,这里是上面Cora数据集解释器的输出示例:
图6
图6 Cora上的特征重要性,有关详细信息,请参见gnn_explainer.py示例

还可以很容易地看到explanation引起的图形。visualize_graph()的输出是explanation subgraph的可视化,根据其重要性值(如果需要,通过配置的阈值)过滤出来后。我们可以选择两个backends (graphviznetworkx):

explanation.visualize_graph('subgraph.png', backend="graphviz")

我们得到了有助于解释的节点和边的局部图,边的不透明度对应于边的重要性。
图7
图7 由gnn_explainer.py示例的解释引起的子图

实现自己的ExplainerAlgorithm

所有的解释计算工作都发生在传递给Explainer类的ExplainerAlgorithm中。已经实现了许多流行的解释算法(如GNNExplainer、PGExplainer等),可以直接使用。然而,如果发现需要一个未实现的ExplainerAlgorithm,只需子类化ExplainerAlgorithm接口并实现两个必要的抽象方法即可。

forward方法计算解释,它具有以下signature:

def forward(self,# the model used for explanationsmodel: torch.nn.Module, # the input node featuresx: Union[torch.Tensor, Dict[NodeType, torch.Tensor]], # the input edge indicesedge_index: Union[torch.Tensor, Dict[NodeType, torch.Tensor]], # the target of the model (what we are explaining)target: torch.tensor, # The index of the model output to explain. # Can be a single index or a tensor of indices.index: Union[int, Tensor], optional, # Additional keyword arguments passed to the model**kwargs: optional, 
) -> Union[Explanation, HeteroExplanation]

为了帮助为不同的解释算法构建forward()方法,基类ExplainerAlgorithm提供了几个有用的辅助函数,如_post_process_mask,用于后处理任何掩码,以不包括消息传递过程中未涉及的元素的任何属性,_get_hard_masks返回仅包括在消息传递期间访问的节点和边的硬节点和边掩码、用于获取模型聚合信息的跳数的_num_hops等。

第二个需要实现的方法是supports()方法:

supports(self) -> bool

supports()函数检查解释器是否支持self.conplainer_configandself.model_config中提供的用户定义的设置,它检查说明算法是否为使用的特定说明设置定义了。

对于异质图的扩展

如上所述,解释(Explanation)可以简单地扩展到异质图和HeteroData。在这种情况下,解释也是一个掩码,但应用于所有节点和边特征(具有不同类型)。为此,PyG实现了HeteroExplanation类,其接口与Explanation几乎完全相同。

此外,为了促进未来在这个方向上的工作,PyG还将异构图支持添加到了CaptumExplainer中,它可以作为未来实现的模板。此外,大部分可解释性框架已经在这个方向上具备了未来的兼容性,其中许多参数被设置为适用于异构情况的可选字典。
图7

解释链路预测

对于那些希望为链接预测提供解释的用户,PyG已经添加了GNNExplainer链接解释支持。这个想法是将边的解释视为一种新的目标索引方法,通过索引到边张量而不是节点特征张量。链接预测解释考虑了两个端点的k-跳邻域的并集。

这个实现与现有代码很好地集成在一起,支持大多数解释配置。一个用于解释链接预测的示例设置如下所示:

model_config = ModelConfig(mode='binary_classification',task_level='edge',return_type='raw',
)
# Explain model output for a single edge:
edge_label_index = val_data.edge_label_index[:, 0]
explainer = Explainer(model=model,explanation_type='model',algorithm=GNNExplainer(epochs=200),node_mask_type='attributes',edge_mask_type='object',model_config=model_config,
)
explanation = explainer(x=train_data.x,edge_index=train_data.edge_index,edge_label_index=edge_label_index,
)
print(f'Generated model explanations in {explanation.available_explanations}')

要查看完整的示例,请查看gnn_explainer_link_pred.py。为了更容易开始实现任何任务级别的解释方法,PyG还提供了对所有任务级别(图形、节点、边)进行参数化测试的示例。有兴趣的读者可以查看test/explain。

总结

这是对PyG中可解释性的快速介绍。目前,PyG中的许多令人兴奋的事情正在进行中,无论是在图解释方面,还是其他图机器学习领域。如果您想加入开源开发者社区,请访问PyG的Slack和GitHub页面!

参考文献

[1] Amara, K., Ying, R., Zhang, Z., Han, Z., Shan, Y., Brandes, U., Schemm, S. and Zhang, C., 2022. GraphFramEx: Towards Systematic Evaluation of Explainability Methods for Graph Neural Networks. arXiv preprint arXiv:2206.09677.
[2] Faber, L., K. Moghaddam, A. and Wattenhofer, R., 2021, August. When comparing to ground truth is wrong: On evaluating gnn explanation methods. In Proceedings of the 27th ACM SIGKDD Conference on Knowledge Discovery & Data Mining (pp. 332–341).
[3] Yuan, H., Yu, H., Gui, S. and Ji, S., 2022. Explainability in graph neural networks: A taxonomic survey. IEEE Transactions on Pattern Analysis and Machine Intelligence.
[4] Ying, Z., Bourgeois, D., You, J., Zitnik, M. and Leskovec, J., 2019. Gnnexplainer: Generating explanations for graph neural networks. Advances in neural information processing systems, 32.
[5] Luo, D., Cheng, W., Xu, D., Yu, W., Zong, B., Chen, H. and Zhang, X., 2020. Parameterized explainer for graph neural network. Advances in neural information processing systems, 33, pp.19620–19631.
[6] Agarwal, C., Queen, O., Lakkaraju, H. and Zitnik, M., 2022. Evaluating explainability for graph neural networks. arXiv preprint arXiv:2208.09339.
[7] Baldassarre, F. and Azizpour, H., 2019. Explainability techniques for graph convolutional networks. arXiv preprint arXiv:1905.13686.
[8] Yuan, H., Yu, H., Wang, J., Li, K. and Ji, S., 2021, July. On explainability of graph neural networks via subgraph explorations. In International Conference on Machine Learning(pp. 12241–12252). PMLR.
[9] Vu, M. and Thai, M.T., 2020. Pgm-explainer: Probabilistic graphical model explanations for graph neural networks. Advances in neural information processing systems, 33, pp.12225–12235.
[10] Azzolin, S., Longa, A., Barbiero, P., Liò, P. and Passerini, A., 2022. Global explainability of gnns via logic combination of learned concepts. arXiv preprint arXiv:2210.07147.

相关文章:

【图神经网络】用PyG实现图机器学习的可解释性

Graph Machine Learning Explainability with PyG 框架总览示例:解释器The Explanation ClassThe Explainer Class and Explanation SettingsExplanation评估基准数据集Explainability Visualisation实现自己的ExplainerAlgorithm对于异质图的扩展解释链路预测 总结…...

HarmonyOS ArkTS Ability内页面的跳转和数据传递

HarmonyOS ArkTS Ability的数据传递包括有Ability内页面的跳转和数据传递、Ability间的数据跳转和数据传递。本节主要讲解Ability内页面的跳转和数据传递。 打开DevEco Studio,选择一个Empty Ability工程模板,创建一个名为“ArkUIPagesRouter”的工程为…...

MySQL 8.0.29 instant DDL 数据腐化问题分析

前言Instant add or drop column的主线逻辑表定义的列顺序与row 存储列顺序阐述引入row版本的必要性数据腐化问题原因分析Bug重现与解析MySQL8.0.30修复方案 前言 DDL 相对于数据库的 DML 之类的其他操作,相对来说是比较耗时、相对重型的操作; 因此对业务的影比较严…...

Haproxy搭建负载均衡

Haproxy搭建负载均衡 一、常见的Web集群调度器二、Haproxy介绍1、Haproxy应用分析2、Haproxy的主要特性3、Haproxy负载均衡策略 三、LVS、Nginx、Haproxy之间的区别四、Haproxy搭建Web群集1、Haproxy服务器部署2、节点服务器部署3、测试Web群集 五、日志定义1、方法一2、方法二…...

SpringBoot:SpringBoot启动加载过程 ④

一、思想 我们看到技术上高效简单的使用,其实背后除了奇思妙想的开创性设计,另一点是别人帮你做了复杂繁琐的事情。 二、从官网Demo入手 官网就一行代码。这个就是它的启动代码。 1、SpringBootApplication注解 ①. 三个核心注解的整合。 SpringBootCon…...

抽象轻松JavaScript

真真假假,鬼鬼,谁知道什么是真什么是假 疑点二:什么是真,什么是假 核心:确定一个清晰的目的,可以达到目的就是真,达不到就是假 知道了核心开始举例 考大学,考上大学就是满足目的…...

深入理解CSS字符转义行为

深入理解CSS字符转义行为 深入理解CSS字符转义行为 前言为什么要转义&#xff1f;CSS 转义什么是合法css的表达式 左半部分右半部分 练习参考链接 前言 在日常的开发中&#xff0c;我们经常写css。比如常见的按钮: <button class"btn"></button>&am…...

【论文阅读】(2023.05.10-2023.06.03)论文阅读简单记录和汇总

(2023.05.10-2023.06.08)论文阅读简单记录和汇总 2023/05/10&#xff1a;今天状态&#xff0c;复阳大残&#xff0c;下午淋了点雨吹了点风&#xff0c;直接躺了四个小时还是头晕- -应该是阳了没跑了。 2023/06/03&#xff1a;前两周出差复阳&#xff0c;这两周调整作息把自己又…...

FPGA开发-ddr测试

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文以米联科开发板为例&#xff0c;介绍ddr测试相关例程。 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 技术名词解释 提示&#xff1a;这…...

BUUCTF 大帝的密码武器 1

题目描述&#xff1a;&#xff08;下载题目&#xff0c;然后修改后缀名为.zip打开&#xff1a;&#xff09; 公元前一百年&#xff0c;在罗马出生了一位对世界影响巨大的人物&#xff0c;他生前是罗马三巨头之一。他率先使用了一种简单的加密函&#xff0c;因此这种加密方法以…...

Linux 查看目录个数和大小

一、查看某目录下的文件个数 1. 查看目录下的文件个数 即当前目录/hdapp目录下有多少个文件&#xff0c;文件夹不计入数值 ls -l | grep "^-"| wc -l下面的命令文件夹也会计入数值 ls | wc -w2. 查看指定目录下的文件个数 如果省略指定目录就是默认当前目录 ls…...

Unity制作二次元卡通渲染角色材质——4 、内外描边和细节添加

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 这里继续讲二次元角色材质。这次打算讲一下描边和细节的添加。 一、外描边 外描边的做法也不止一种&#xff0c;比如后处理方法的偏导数ddx/ddy之类的&#xff0c;也能整个屏幕的求出边缘。但一般来说单模型渲…...

Ubuntu安装GCC10

使用包安装的方式安装 sudo apt upgradesudo apt install software-properties-commonsudo add-apt-repository ppa:ubuntu-toolchain-r/test QA: 更新python3.7后出现ModuleNotFoundError: No module named ‘apt_pkg‘错误QA: Cannot import name ‘_gi’ sudo apt updatesu…...

【flutter】Dart 规范2

高效 Dart 语言指南&#xff1a;用法示例 每天在你写的 Dart 代码中都会应用到这些准则。库的使用者可能不需要知道你在其中的一些想法&#xff0c;但是维护者肯定是需要的。 库 这些准则可以帮助你在多个文件编写程序的情况下保证一致性和可维护性。为了让准则简洁&#xf…...

k8s CoreDns详解

一、概述 服务发现是 K8s 的一项很重要的功能。K8s 的服务发现有两种方式&#xff0c;一种是将 svc 的 ClusterIP 以环境变量的方式注入到 pod 中&#xff1b;一种就是 DNS&#xff0c;从 1.13 版本开始&#xff0c;coreDNS 就取代了 kube dns 成为了内置的 DNS 服务器。 Cor…...

c++ 连sqlserver

//要在 C 中连接 SQL Server 数据库&#xff0c;可以使用 Microsoft 提供的 SQL Server Native Client 或者 //ODBC 驱动程序。以下是使用 SQL Server Native Client 连接数据库的基本步骤&#xff1a; //1. 安装 SQL Server Native Client 驱动程序。 //2. 在 C 代码中包含头…...

给钉钉的2个建议

1. 建议.MD文件可以实现在线编辑 .MD文件可以实现在线编辑。 现状&#xff1a;word、excel、txt等文件都可以实现在线编辑&#xff0c;期望.MD文件也可以进行在线编辑&#xff0c;便于喜欢用.MD文旦交流的人使用。 2. 增加群内根据关键词自定义提醒功能 随着个人加入的群聊增多…...

STL之优先级队列(堆)的模拟实现与仿函数(8千字长文详解!)

STL之优先级队列&#xff08;堆&#xff09;的模拟实现与仿函数 文章目录 STL之优先级队列&#xff08;堆&#xff09;的模拟实现与仿函数优先级队列的概念priority_queue的接口介绍优先级队列的构造函数 priority_queue模拟实现类成员构造函数向下调整算法——正常实现 push向…...

设施管理系统

随着经济的快速发展&#xff0c;各种基础设施都在更新&#xff0c;在企事业单位中各种设施也都难以管理&#xff0c;以往传统的管理模式已经无法适应现代社会的需求&#xff0c;设备管理的滞后反而会影响设施设备的使用效果&#xff0c;因此设施设备管理系统必不可少。那么什么…...

JavaScript:获取当前日期、星期、时间 | Data对象

文章目录 1 Date对象2 代码示例3 获取 yyyy-MM-dd 格式的日期 1 Date对象 JavaScript 中的 Date 对象表示日期和时间。Date 对象基于自 1970 年 1 月 1 日 00:00:00 UTC&#xff08;协调世界时&#xff09;以来的毫秒数。以下是 Date 对象的一些常用方法和属性。 getFullYear…...

Cadence原理图快速查找元器件的方法

1.Cadence原理图快速查找元器件的方法 ①在红框中输入元器件编号&#xff0c;点击望远镜的图标在底下的状态栏可看到查找到的相关元器件&#xff0c;点击元器件可自动定位当前元器件的位置。 ②点击hierarchy&#xff08;层&#xff09;可自主查找&#xff0c;找到后点击序号即…...

科目二 调整座椅

靠背倾角 座椅高低 座椅前后用手抬起座椅前的横杠&#xff0c;让座椅向后移动方便上车 靠背左侧&#xff0c;向后扳扳杠调整倾角 座椅左侧&#xff0c;上下扳动调整高低头顶距车顶有一拳的距离 座椅前横杠一只手提起横杠另一只手握住方向盘前拉、后推调整到合适位置&#xff0c…...

02.加载GDT表,进入保护模式

加载GDT表&#xff0c;进入保护模式 加载GDT表&#xff0c;实现操作系统从实模式进入保护模式 参考 操作系统学习 — 启动操作系统&#xff1a;进入保护模式 保护模式与实模式 GDT、GDTR、LDT、LDTR 调用门与特权级 趣谈 Linux 操作系统 在01.硬盘启动盘&#xff0c;加载操作系…...

MySQL(进阶篇3.0)

锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算机资源&#xff08;CPU、RAM、I/O&#xff09;的争用之外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&…...

2023.6.8小记——嵌入式系统初识、什么是ARM架构?

今天还挺充实的&#xff0c;早上在图书馆本来想学一下notion&#xff0c;结果看李沐老师的动手深度学习看到十点半&#xff0c;在电脑上配置了李沐老师的d2l和jupyter&#xff0c;等后续有时间的时候再继续学。 下午看了一下notion的使用方法&#xff0c;这玩意初学者用起来是…...

分布式运用之ELK企业级日志分析系统

1.ELK的相关知识 1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch&#xff1a; 是基于Lucene&#xff08…...

【华为OD机试真题 C语言】8、停车场车辆统计 | 机试真题+思路参考+代码解析

文章目录 一、题目&#x1f383;题目描述&#x1f383;输入输出&#x1f383;样例1&#x1f383;样例2 二、思路参考三、代码参考&#x1f3c6;C语言 作者&#xff1a;KJ.JK &#x1f342;个人博客首页&#xff1a; KJ.JK &#x1f342;专栏介绍&#xff1a; 华为OD机试真题汇…...

c++ MES 对接(XML、JSON、SOAP)

&#x1f5d1;️ 清空 //MES系统对接可以使用多种协议&#xff0c;包括XML、JSON和SOAP等。 //以下是使用C语言进行MES系统对接的示例代码&#xff1a; //1. XML协议对接&#xff1a; //c #include <iostream> #include <string> #include <vector> #incl…...

idea导入java web项目带jar

可参考&#xff1a;idea导入Javaweb项目_小黑cc的博客-CSDN博客 配置tomcat 加载项目jar依赖 最后点ok&#xff0c;tomcat启动 jsp页面的项目&#xff0c;必须要加载这两个jar包...

【第55天|● 392.判断子序列 ● 115.不同的子序列 】

392.判断子序列 class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0)return true;if(t.size()0) return false;vector<bool> dp(t.size()1, true);for(int i0; i<s.size(); i){for(int jt.size(); j>0; j--){if(s[i]t[j-1]&&…...

模板网站建设平台/如何把网站推广出去

很多同学兴许有这样的烦恼&#xff0c;就是对于自己文件夹中的相似的图片想删除&#xff0c;可是奈何图片太多&#xff0c;所以手动删除太浪费时间了&#xff0c;那么今天学到这段代码&#xff0c;就不需要手动了。 如下是我对视频截取的一些帧&#xff0c;我通过算法将这些相似…...

网站建设市场定位/优化营商环境发言稿

快速入门 在Spring Boot中&#xff0c;当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候&#xff0c;框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用Transactional注解进行…...

网站策划书需求分析/新手怎么学电商运营

数据库系统概论-第三章第三章 SQL3.1 SQL语言概述3.2 SQL数据定义3.2.1 基本类型3.2.2 基本模式定义3.3 SQL查询的基本结构3.3.1 单关系查询3.3.2 多关系查询3.3.3 自然连接3.4 附加的基本运算3.4.1 更名运算3.4.2 字符串运算3.4.3 select子句中的属性说明3.4.4 排列元组的显示…...

wordpress图片清理插件下载/济南seo排名优化推广

由于很久没有碰ASP.NET(最近都在做C/S的项目),最近在看MS的PetShop的时候遇到了一些不明白的地方-----就是Form验证,于是查了些资料狂恶补了下,大概的意思如下首先在Web.Config里面设置如下<Authtication mode"form"><forms name"PetShopAuth" lo…...

永久免费手机网站建设/seo的最终是为了达到

解决方法:考虑在后面加一句&#xff1a;plt.show() 原理&#xff1a;plt.imshow()函数负责对图像进行处理&#xff0c;并显示其格式&#xff0c;而plt.show()则是将plt.imshow()处理后的函数显示出来。 转载于:https://www.cnblogs.com/w33-blog/p/9956252.html...

武汉网站制作好/数据网站

之前我们做的都是单表查询&#xff0c;那么问题来了&#xff0c;如果我们想要做多表关联查询该怎么处理呢&#xff0c;本篇Blog来探索关联查询&#xff08;多对一关系&#xff09;和集合查询&#xff08;一对多关系&#xff09;的实现方式。同样还是在之前的Person表基础上做一…...