基于Node2Vec的图嵌入实现过程

news2024/11/29 21:35:27

目录

  • 一、引言
  • 二、Node2Vec(原理)
    • 2.1 随机游走(Random Walk)
    • 2.2 嵌入学习
    • 2.3 Node2Vec 的优势
  • 三、使用 Node2Vec 进行图嵌入(实践)
    • 3.1 读取和转换 JSON 文件为 Graph 对象
    • 3.2 训练 Node2Vec 模型
    • 3.3 二维嵌入可视化
    • 3.4 三维嵌入可视化
    • 3.5 保存嵌入和关系到 JSON 文件
    • 3.6 完整代码
  • 四、结论

一、引言

  随着互联网的发展,社交网络、推荐系统以及知识图谱等应用中的图结构数据越来越多,如何从这些复杂的关系网中提取出有意义的信息,成为了机器学习中的一大挑战。图结构数据的关键在于节点(如用户、物品等)之间的关联关系,而要从图中有效提取节点的特征,我们需要一种能保留图的结构信息的嵌入方法。

  传统的机器学习方法难以直接处理图数据,因为图的结构不如图像和文本那样规则,图中的节点没有固定的顺序,也没有明确的拓扑形式。因此,近年来图嵌入(Graph Embedding)技术得到了广泛关注。通过图嵌入方法,我们可以将图中的节点映射为低维向量,使其能够被应用到分类、聚类、推荐等任务中。

  Node2Vec 是一种基于随机游走(Random Walk)的节点嵌入方法。它通过对图中的节点进行采样,并利用这些采样结果训练出能够表示节点的嵌入向量。这些向量不仅能保留节点的局部邻域信息,还能反映节点在整个图中的全局位置。本文的目的在于详细介绍如何通过代码实践使用Node2Vec进行图嵌入、对嵌入结果进行可视化,并最终将嵌入向量存储为JSON文件。

二、Node2Vec(原理)

2.1 随机游走(Random Walk)

  Node2Vec 基于图上的随机游走来捕捉节点的结构特性。随机游走是一种类似于在图上进行漫步的过程,即从一个节点出发,每次根据一定的概率选择下一个要访问的节点。通过多次游走,Node2Vec可以得到一系列的节点序列,这些序列可以看作是图中的“路径”,用于训练节点的嵌入表示。

  Node2Vec 提供了两个关键参数 p p p q q q,用来控制随机游走的方式:

  • 参数 p p p:回归系数,用于控制游走时返回前一个节点的概率。 p p p 越大,模型越倾向于向更远的节点扩展。

  • 参数 q q q:探索系数,用于控制模型深度优先搜索(DFS)和广度优先搜索(BFS)之间的平衡。 q q q 越大,游走更倾向于深度探索,即更多地访问图的深层节点; q q q 较小时,游走更倾向于广度探索,即优先访问节点的直接邻居。

  通过调节这两个参数,Node2Vec 能够适应不同的任务需求。例如,在社交网络中,我们可能希望重点关注与用户相邻的其他用户,此时较小的 q q q值能帮助我们更好地捕捉局部社区结构。而在知识图谱中,我们可能希望深入挖掘某个概念与远端概念的关系,此时较大的 q q q 值可以帮助捕获图的全局结构。

在这里插入图片描述

2.2 嵌入学习

  一旦通过随机游走得到节点序列,Node2Vec 将这些序列视为词语序列,采用类似 Word2Vec 的 Skip-Gram 模型进行嵌入学习。Skip-Gram 模型的目标是给定一个节点,预测其上下文节点(即在随机游走序列中与该节点相邻的节点)。

  在这个过程中,Node2Vec 学习到每个节点的嵌入向量。这些嵌入向量能够保留节点之间的相似性,邻近的节点将拥有相近的嵌入表示。最终,通过这种方式,图中的每个节点都被映射到一个固定维度的向量空间中,嵌入向量可以直接用于下游任务,如节点分类、边预测和社区检测。

2.3 Node2Vec 的优势

  Node2Vec 的最大优势在于它可以同时捕捉局部和全局的图结构信息。相比于传统的图算法(如PageRank)只考虑节点的全局属性,或者某些仅仅考虑局部连接的嵌入方法,Node2Vec 能够通过灵活的随机游走策略,在不同的场景下取得更好的表现。

  此外,Node2Vec 的随机游走策略可以高效处理大型图,尤其是对于节点和边非常多的复杂网络,Node2Vec 仍然能通过较少的计算时间获得高质量的嵌入向量。

三、使用 Node2Vec 进行图嵌入(实践)

3.1 读取和转换 JSON 文件为 Graph 对象

  在正式训练模型之前,首先我们需要将原始的数据加载为图结构。在很多实际应用场景中,图结构的输入数据并不是直接以图的形式给出,而是以诸如JSON等格式的文件存储了节点之间的关系。因此,第一步的任务是将JSON文件中的节点和边转化为可以用于训练的 Graph 对象。(本文使用的json文件可以从百度网盘下载)

import json
import networkx as nx

# 读取并转换JSON文件为Graph对象的函数
def read_and_convert_json_to_graph(json_file):
    with open(json_file, 'r') as file:
        json_list = json.load(file)

    G = nx.Graph()  # 创建一个空的无向图
    for item in json_list:
        G.add_edge(item['object1'], item['object2'])  # 添加边

    return G

  在上面的代码中,read_and_convert_json_to_graph 函数负责读取JSON文件,并将其中的节点(object1 和 object2)之间的关系转换为图的边(edge)。具体过程如下:

  • 通过 json.load() 将JSON文件中的内容加载为Python的列表格式。

  • 遍历该列表中的每个元素,并使用 networkx 库将两个节点之间的关系加入到无向图 G 中。

  最终,我们会得到一个完整的 Graph 对象,它包含了所有节点及它们之间的连接。这个 Graph 对象将作为Node2Vec 模型的输入,进一步进行节点嵌入训练。

3.2 训练 Node2Vec 模型

  接下来,利用构建好的图对象,我们将使用Node2Vec库进行节点嵌入的训练。Node2Vec 的核心思想是通过随机游走生成节点序列,并通过这些序列学习节点的嵌入表示。

from node2vec import Node2Vec

# Node2Vec模型训练函数
def train_node2vec(graph, dimensions=64, walk_length=30, num_walks=200, p=1, q=1, workers=4):
    node2vec = Node2Vec(graph, dimensions=dimensions, walk_length=walk_length, num_walks=num_walks, p=p, q=q, workers=workers)
    model = node2vec.fit(window=10, min_count=1, batch_words=4)
    return model

  在这个 train_node2vec 函数中,我们定义了几个关键参数来控制Node2Vec的训练过程:

  • dimensions:嵌入向量的维度,即我们希望每个节点被映射到多少维度的向量空间。通常,维度越高,模型能表达的信息越丰富,但训练时间也会增加。

  • walk_length:随机游走的长度,决定每次游走过程中访问的节点数目。

  • num_walks:每个节点的游走次数,即我们为每个节点采样的路径数量。

  • p 和 q:前面介绍的控制游走策略的两个参数,分别控制返回前一节点的概率和探索新节点的概率。

  • workers:并行计算的线程数,用于加速训练过程。

  训练完成后,fit() 函数返回的是一个包含了所有节点嵌入向量的模型对象。我们可以通过该模型获取每个节点的嵌入向量,并将这些向量用于后续的任务。

3.3 二维嵌入可视化

  在训练完Node2Vec模型并得到节点的高维嵌入向量后,直接查看这些高维向量并不直观,因此我们通常需要将其降维,以便通过图形展示这些节点在嵌入空间中的分布情况。

  二维可视化是最常用的手段之一。我们可以使用降维算法(如主成分分析 PCA)将嵌入向量从高维空间降至二维,从而通过平面图直观展示节点之间的相对位置。接下来是实现代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 二维可视化嵌入的函数
def visualize_embeddings(model, graph, save_path='embeddings_visualization.png'):
    # 获取所有节点的嵌入向量
    embeddings = np.array([model.wv[str(node)] for node in graph.nodes()])
    
    # 使用PCA将嵌入向量降维到2D
    pca = PCA(n_components=2)
    embeddings_2d = pca.fit_transform(embeddings)

    # 绘制图形
    plt.figure(figsize=(20, 16))  # 设置图形大小
    pos = {node: embeddings_2d[i] for i, node in enumerate(graph.nodes())}

    # 绘制节点,设置节点大小和颜色
    nx.draw_networkx_nodes(graph, pos=pos, node_size=30, node_color='blue')

    # 绘制图中的边,透明度alpha设置较低以减少边线干扰
    nx.draw_networkx_edges(graph, pos=pos, alpha=0.1)

    # 隐藏坐标轴
    plt.axis('off')

    # 保存结果并展示图像
    plt.savefig(save_path)
    plt.show()
  • 获取节点嵌入向量:从训练好的 Node2Vec 模型中提取节点的嵌入向量,这些嵌入向量被保存在 model.wv 中,其中每个节点的 ID 被转化为字符串格式。

  • PCA降维:使用 PCA 将高维嵌入向量降至二维。PCA 是一种常见的降维技术,它能够提取数据中最重要的两个主成分,使得降维后的数据尽可能保留原始高维数据中的信息。

  • 节点和边的可视化:通过 networkx 提供的 draw_networkx_nodes 和 draw_networkx_edges 方法来绘制图形中的节点和边。节点颜色为蓝色,边的透明度较低,以减少边线的干扰,使节点的位置关系更加清晰可见。

  • 图形保存与显示:绘制好的图形保存为 PNG 文件,并显示出来以供查看。plt.savefig() 可以保存结果,plt.show() 用于在执行程序时显示图像。

  通过这种方式,节点会根据其嵌入向量的相似性在二维平面上分布。距离较近的节点往往在嵌入空间中更为相似,说明它们在图结构中有更密切的联系。反之,距离较远的节点可能属于不同的社区或子图。

3.4 三维嵌入可视化

  虽然二维可视化已经能帮助我们理解节点嵌入,但在某些场景中,我们可能希望更丰富的维度来展示节点的分布。此时,三维可视化可以提供更直观的展示效果。通过降维到三维,我们能够通过三维图形进一步观察节点的相互关系。

from mpl_toolkits.mplot3d import Axes3D
from sklearn.decomposition import PCA

# 三维可视化嵌入的函数
def visualize_embeddings_3d(model, graph, save_path='embeddings_visualization_3d.png'):
    # 获取所有节点的嵌入向量
    embeddings = np.array([model.wv[str(node)] for node in graph.nodes()])
    
    # 使用PCA将嵌入向量降维到3D
    pca = PCA(n_components=3)
    embeddings_3d = pca.fit_transform(embeddings)

    # 创建3D绘图
    fig = plt.figure(figsize=(20, 16))
    ax = fig.add_subplot(111, projection='3d')

    # 获取嵌入向量的三个维度(x, y, z坐标)
    xs = embeddings_3d[:, 0]
    ys = embeddings_3d[:, 1]
    zs = embeddings_3d[:, 2]

    # 绘制节点
    ax.scatter(xs, ys, zs, c='blue', marker='o')

    # 设置轴标签
    ax.set_xlabel('PCA1')
    ax.set_ylabel('PCA2')
    ax.set_zlabel('PCA3')

    # 添加标题
    plt.title('3D visualization of Node Embeddings')

    # 保存并展示图像
    plt.savefig(save_path)
    plt.show()
  • PCA降维到三维:与二维可视化类似,这里我们将嵌入向量从高维空间降至三维。这三个维度能够提供更多的嵌入信息,从而帮助我们更好地观察节点的分布情况。

  • 三维绘图:通过 mpl_toolkits.mplot3d 的 Axes3D 类进行三维图形的绘制。我们提取PCA降维后的三个维度(x、y、z坐标),并将其用于三维散点图的绘制。

  • 散点绘制:使用 scatter() 函数绘制节点,每个节点显示为一个三维点。我们可以通过颜色、大小、标记等属性来调整节点的视觉效果。在本例中,节点颜色为蓝色,标记为圆形。

  • 图形轴标签与标题:为三维图形的各个坐标轴(PCA1、PCA2、PCA3)添加标签,以便清晰显示每个维度代表的含义。此外,还为图形添加了标题,方便理解可视化内容。

  三维图形相比于二维图形能够展示更多的信息。特别是在处理嵌入维度较高的情况下,三维可视化能够帮助我们更好地理解节点在嵌入空间中的位置关系。通过旋转三维图形,我们可以从不同角度观察节点的分布情况,发现潜在的社区结构或其他有趣的模式。

3.5 保存嵌入和关系到 JSON 文件

  在获得了节点嵌入向量后,我们往往需要将这些向量保存下来,方便后续的分析与应用。在实际项目中,我们可能需要将嵌入向量与原始的关系数据一起存储,以便后续模型或任务能够继续利用这些嵌入。

  下面的代码展示了如何将节点的嵌入向量与原始的JSON文件结合,并将结果保存为一个新的JSON文件。

def save_embeddings_to_json(graph, model, json_file_path, output_file):
    # 读取原始的JSON文件来获取对象间的关系
    with open(json_file_path, 'r') as file:
        json_list = json.load(file)

    output_data = []

    for item in json_list:
        object1, object2 = item['object1'], item['object2']

        # 对于每对对象,获取其嵌入向量
        properties1 = model.wv[object1].tolist() if object1 in model.wv else None
        properties2 = model.wv[object2].tolist() if object2 in model.wv else None

        # 构建新的字典项,包含嵌入向量和原始关系
        modified_item = {
            "object1": object1,
            "properties1": properties1,
            "object2": object2,
            "properties2": properties2,
            "relationship": item.get('relationship')  # 假设原始JSON中包含关系字段
        }
        output_data.append(modified_item)

    # 将修改后的数据写入新的JSON文件
    with open(output_file, 'w') as f:
        json.dump(output_data, f, indent=4)
  • 原始关系读取:首先,我们读取原始的JSON文件,获取其中包含的节点及其关系。在本例中,JSON文件中的每一条记录包含两个对象(object1 和 object2),代表它们之间的某种关系。

  • 嵌入向量提取:对于每个对象,我们通过模型中的 model.wv 获取其对应的嵌入向量。如果某个对象没有嵌入向量(例如由于它在训练中未出现),我们可以将其设置为 None。

  • 数据结构修改:将每对对象的嵌入向量(properties1 和 properties2)与它们的关系信息(relationship)一起构造一个新的数据项。

  • 结果保存:最终,将所有修改后的数据写入一个新的JSON文件,以便在后续的分析中使用。

3.6 完整代码

import json
import numpy as np
from node2vec import Node2Vec
import networkx as nx
import matplotlib.pyplot as plt


# 读取并转换JSON文件为Graph对象的函数
def read_and_convert_json_to_graph(json_file):
    with open(json_file, 'r') as file:
        json_list = json.load(file)

    G = nx.Graph()  # 创建一个空的无向图
    for item in json_list:
        G.add_edge(item['object1'], item['object2'])  # 添加边

    return G


# Node2Vec模型训练函数
def train_node2vec(graph, dimensions=64, walk_length=30, num_walks=200, p=1, q=1, workers=4):
    # 使用Node2Vec库
    node2vec = Node2Vec(graph, dimensions=dimensions, walk_length=walk_length, num_walks=num_walks, p=p, q=q,
                        workers=workers)

    # 训练模型
    model = node2vec.fit(window=10, min_count=1, batch_words=4)

    return model


# 可视化嵌入的函数,实现二维可视化
def visualize_embeddings(model, graph, save_path='embeddings_visualization.png'):
    # 获取嵌入向量
    embeddings = np.array([model.wv[str(node)] for node in graph.nodes()])

    # 使用PCA进行降维以便于可视化
    from sklearn.decomposition import PCA
    pca = PCA(n_components=2)
    embeddings_2d = pca.fit_transform(embeddings)

    # 绘制节点嵌入
    plt.figure(figsize=(20, 16))
    pos = {node: embeddings_2d[i] for i, node in enumerate(graph.nodes())}

    # 调整节点大小和边的透明度
    nx.draw_networkx_nodes(graph, pos=pos, node_size=30, node_color='blue')
    edges = nx.draw_networkx_edges(graph, pos=pos, alpha=0.1)  # 减少alpha以降低边的透明度

    plt.axis('off')  # 关闭坐标轴
    plt.savefig(save_path, format='PNG')  # 先保存可视化结果到文件
    plt.show()  # 然后显示图像
    plt.close()  # 关闭图形,防止重复显示

# 修改后的可视化嵌入函数,实现三维可视化
def visualize_embeddings_3d(model, graph, save_path='embeddings_visualization_3d.png'):
    # 获取嵌入向量
    embeddings = np.array([model.wv[str(node)] for node in graph.nodes()])

    # 使用PCA进行到3维的降维
    from sklearn.decomposition import PCA
    pca = PCA(n_components=3)
    embeddings_3d = pca.fit_transform(embeddings)

    # 创建3D绘图
    fig = plt.figure(figsize=(20, 16))
    ax = fig.add_subplot(111, projection='3d')

    # 获取节点的三维坐标
    xs = embeddings_3d[:, 0]
    ys = embeddings_3d[:, 1]
    zs = embeddings_3d[:, 2]

    # 绘制节点
    ax.scatter(xs, ys, zs, c='blue', marker='o')

    ax.set_xlabel('PCA1')
    ax.set_ylabel('PCA2')
    ax.set_zlabel('PCA3')
    plt.title('3D visualization of Node Embeddings')

    plt.savefig(save_path, format='PNG')  # 保存可视化结果到文件
    plt.show()  # 显示图像
    plt.close()  # 关闭图形,防止重复显示

def save_embeddings_to_json(graph, model, json_file_path, output_file):
    # 首先,读取原始的JSON文件来获取对象间的关系
    with open(json_file_path, 'r') as file:
        json_list = json.load(file)

    output_data = []

    for item in json_list:
        object1, object2 = item['object1'], item['object2']
        # 对于每对对象,获取其嵌入向量
        properties1 = model.wv[object1].tolist() if object1 in model.wv else None
        properties2 = model.wv[object2].tolist() if object2 in model.wv else None
        # 构建新的字典项
        modified_item = {
            "object1": object1,
            "properties1": properties1,
            "object2": object2,
            "properties2": properties2,
            "relationship": item.get('relationship')  # 假设原始JSON中包含关系字段
        }
        output_data.append(modified_item)

    # 将修改后的数据写入新的JSON文件
    with open(output_file, 'w') as f:
        json.dump(output_data, f, indent=4)

# 主程序
if __name__ == "__main__":
    json_file_path = 'Node2Vec_Input.json'
    output_file = 'Node2Vec_Embeddings_Dim768.json'

    G = read_and_convert_json_to_graph(json_file_path)

    #节点嵌入维度为dimensions
    model = train_node2vec(G, dimensions=768, walk_length=20, num_walks=200, p=1, q=2, workers=4)
    visualize_embeddings_3d(model, G, 'embeddings_visualization_Dim768_3D_20-200-1-2-4.png')

    # 调用新定义的函数,保存嵌入和关系到JSON
    save_embeddings_to_json(G, model, json_file_path, output_file)

四、结论

  通过以上的过程,我们完整地介绍了如何使用Node2Vec进行图嵌入、如何将嵌入结果可视化以及如何保存嵌入向量。Node2Vec 提供了一种灵活且高效的方式来处理图数据,并且能够通过参数调整适应不同的图结构。通过嵌入向量,我们可以将图结构信息转化为适合机器学习模型处理的低维向量形式,从而为分类、聚类、推荐系统等任务提供支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+Django微信小程序前后端人脸识别登录注册

程序示例精选 PythonDjango微信小程序前后端人脸识别登录注册 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonDjango微信小程序前后端人脸识别登录注册》编写代码,代码整…

2024年10月6日历史上的今天大事件早读

23年10月06日西汉“新莽政权”领袖王莽被刺身亡 1866年10月06日清政府批准筹设天津机器局 1905年10月06日俄国爆发铁路工人大罢工 1913年10月06日中、英西姆拉会商“西藏问题” 1927年10月06日阿尔-乔尔森主演第一部有声电影 1940年10月06日新四军获黄桥决战胜利 1949年1…

字节跳动员工玩转 AI 的 100 种办法

今年,字节跳动在国内上线了 AI 应用开发平台——扣子。用户可以根据自己的想法在扣子上创建 chat bot(聊天机器人),甚至能利用扣子 API 上线一个产品。 扣子上有丰富的插件工具,如果用户希望 bot 具备某个功能&#x…

sql-labs靶场第九关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库,查看数据库名称 ③爆表,查看security库的所有表 ④爆列,查看users表的所有列 ⑤成功获取用户名…

2024年,现在做全职的AI产品经理,时机对不对?

就在最近,Chatgpt又更新了,推出了新版本名字叫做canvas。 这个版本可以支持对AI的对话内容进行编辑了,也就是以前prompt一次性生成的结果总是很难控制输出结果,新版新增了可以在结果内容与用户进行交互的产品入口,最终…

(20)MATLAB使用卡方(chi-square)分布生成Nakagami-m分布

文章目录 前言一、使用卡方分布函数生成Nakagami分布随机变量二、MATLAB仿真1.仿真代码2.运行结果 前言 Nakagami分布随机变量的生成,可以使用gamma分布实现,也可以使用卡方(chi-square)分布随机变量生成。使用伽马(g…

AI 写作工具汇总

🐣个人主页 可惜已不在 🐤这篇在这个专栏AI_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 前言: 正文: ​ 前言: 在信息时代的浪潮中,AI 写作应运而生。它以强大的算法和海量的数据为支撑&…

文本处理 — JavaScript 中的字符串——WEB开发系列44

掌握它所出现的文本是很有用的,字符串是最基本的数据类型之一,承载着我们与计算机之间的交流。它们可以用来表示文本、传递信息、构建用户界面等。JavaScript作为一种广泛使用的编程语言,为字符串提供了强大而灵活的处理功能。 一、创建字符串…

图解 Stable Diffusion 如何实现文生图

前言 1引言 Stable Diffusion 是 2022 年发布的深度学习文生图模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如内补和外补绘制,以及在提示词指导下产生图生图的翻译。 算法原理 Stable Diffusion 是一种扩散模…

Python+Django预约管理系统

程序示例精选 PythonDjango预约管理系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonDjango预约管理系统》编写代码,代码整洁,规则,易读。 学习…

【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。

【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。 【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。 文章目录 【深度学习基础模型】液态状态机&#xff0…

No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线

在这个数字时代,网络安全无处不在。了解Web安全的基本知识,不仅能保护我们自己,也能帮助我们在技术上更进一步。让我们一起深入探索Web安全的世界,掌握那些必备的安全知识! 1. 客户端与WEB应用安全 前端漏洞&#xff1…

【PACS源码】C#.net医学影像管理系统源码,支持CT、MR、CR、DR、ECT、DSA、X光机、超声、内镜、病理等多种设备。

PACS医学影像管理与传输系统软件可对医学仪器输出的视频信号进行接收、处理、存储、报告输出、管理、查询等,并支持网络,实现资源共享。为医院对病人信息资料进行数字化、科学化、网络化管理提供了必要的工具。 基于DICOM标准的PACS医学影像管理系统&am…

【C++】二叉搜索树+变身 = AVL树

🚀个人主页:小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋:插入新节点后单纯的右边高2.2.2 …

Linux dlsym符号查找疑惑分析

dlsym 函数是 Linux 下动态链接库(shared library)编程中的一个重要函数。它用于在运行时获取动态链接库中符号的地址,通常用于获取函数指针或变量的地址。 以下是 dlsym 函数的基本用法和示例。 1. 函数原型 void *dlsym(void *handle, c…

3. OOP封装 -- get、set方法

文章目录 1. 抛出问题:存在安全隐患2. 那咋办呢?3. 上述方案行不通,只能引入封装的概念① public向private过渡② 这种情况下如何修改信息,使用get和set方法如何限制用户输入企业中为什么不用public快捷键生成所有私有成员变量的g…

老系统处理策略

1. 改造策略 定义:对技术含量高、业务价值大的遗留系统进行功能增强和数据模型改造。 适用场景:系统较新,能满足业务需求,但需增加新功能或优化数据模型。 优点:增强功能,优化数据,提升系统性…

第一批用大模型的程序员,已经碾压同事了...

自 ChatGPT 面世以来,市场上一直用“iPhone 时刻”“划时代”“工业革命”等关键词来形容 AI 领域的飞速进展。如今,AI 大模型的战争已经开启大卷特卷模式。 OpenAI 炸裂推出 GPT-4o,科幻电影照进现实,不仅免费可用,能…

Buck电路-电感电容计算

目录: 1、前置知识 1)电感的公式 2)电容的公式 3)Buck电路框图 2、占空比D的计算 1)Switch(on)状态 2)Switch(off)状态 3)占空比计算 3、电感计算 4、电容计算 5、电荷平衡与伏秒…

企业数字化转型中优化IT投资与资源管理的战略路径

IT投资优化与资源管理在数字化转型中的关键作用 在数字化时代,企业的成功不仅取决于其业务创新和市场拓展,还极大依赖于信息技术(IT)投资和资源管理的效率。随着云计算、大数据、人工智能等技术的飞速发展,企业必须在…