专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

python基于Node2Vec怎么实现节点分类及其可视化

来源:小易整编  作者:小易  发布时间:2024-03-19 07:51
摘要:简介node2vec是一种用于图嵌入(graphembedding)的方法,可用于节点分类、社区发现和连接预测等任务。实现过程 加载数据集首先,让我们加载所需的Python库并执行以下代码以加载Cora数据集:importnetwork...
简介

node2vec是一种用于图嵌入(graph embedding)的方法,可用于节点分类、社区发现和连接预测等任务。

python基于Node2Vec怎么实现节点分类及其可视化

实现过程 

加载数据集

首先,让我们加载所需的Python库并执行以下代码以加载Cora数据集:

import networkx as nx import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline from sklearn.manifold import TSNE from node2vec import Node2Vec # 加载Cora数据集cora = pd.read_csv('cora/cora.content', sep='\t', header=None)cited_in = pd.read_csv('cora/cora.cites', sep='\t', header=None,                       names=['target', 'source'])nodes, features = cora.iloc[:, :-1], cora.iloc[:, -1]
登录后复制

其中 cora.content 包含了所有节点特征信息,一共具有2708个节点和1433个特征;而 cora.cites 通过引文映射分别针对所述每个节点建立一个节点间的有向边关系,共有5429个边。接下来,我们需要将节点特征和引用信息合并,构建图结构。

# 定义函数:构造基于Cora数据集的图结构def create_graph(nodes, features, cited_in):    nodes.index = nodes.index.map(str)    graph = nx.from_pandas_edgelist(cited_in,                                    source='source',                                    target='target')    for index, row in nodes.iterrows():        node_id = str(row[0])        features = row.drop(labels=[0])        node_attrs = {f'attr_{i}': float(x) for i, x in enumerate(features)}        if graph.has_node(node_id) == True:            temp = graph.nodes[node_id]            temp.update(node_attrs)            graph.add_nodes_from([(node_id, temp)])        else:            graph.add_nodes_from([(node_id, node_attrs)])    return graph# 构建图graph = create_graph(nodes, features, cited_in)
登录后复制

该函数将 cora.content 中的节点特征与 cora.cites 的有向边整合,并在图上标记它们。现在我们已经构建了一个图形视图,可以按想法可视化。

使用Node2vec嵌入数据

为了进行节点特征分类,我们需要从网络中提取一些信息并将其作为输入传递给分类器。一个示例是使用节点2矢量方法将提取的信息转化为向量表达式,使每个节点至少具有一个维度。

通过随机游走样本从起始节点到目标节点,Node2Vec模型学习代表每个节点的向量。 节点2Vec模型定义随机游走过程中节点间的转移概率。

我们将使用 node2vec 库来生成图形的嵌入表示,并采用神经网络进行节点分类。

# 定义函数:创建基于Cora数据集的嵌入def create_embeddings(graph):    # 初始化node2vec实例,指定相关超参数    n2v = Node2Vec(graph, dimensions=64, walk_length=30,                   num_walks=200, p=1, q=1, weight_key='attr_weight')    # 基于指定参数训练得到嵌入向量表达式    model = n2v.fit(window=10, min_count=1, batch_words=4)    # 获得所有图中节点的嵌入向量    embeddings = pd.DataFrame(model.wv.vectors)    ids = list(map(str, model.wv.index2word))    # 将原有的特征和id与新获取到的嵌入向量按行合并    lookup_table = nodes.set_index(0).join(embeddings.set_index(embeddings.index))    return np.array(lookup_table.dropna().iloc[:, -64:]), np.array(list(range(1, lookup_table.shape[0] + 1)))# 创建嵌入向量cora_embeddings, cora_labels = create_embeddings(graph)
登录后复制

通过以上代码,我们可以获得每个节点的64维节点嵌入表达。

训练分类器

接下来我们将指定一些分类器并在Cora数据集上训练它们,以期根据嵌入进行准确的节点分类操作。

from sklearn import svm, model_selection, metrics # 使用支持向量机作为示范的分类器svm_model = svm.SVC(kernel='rbf', C=1, gamma=0.01)# 进行交叉验证和分类训练scores = model_selection.cross_val_score(    svm_model, cora_embeddings, cora_labels, cv=5)print(scores.mean())
登录后复制

为了获得更好的性能,支持向量机作为分类器时,我们还需要对其进行相关调参操作。此处采取了5折交叉验证的方式对其性能进行评估输出。

可视化节点嵌入

为了更好地理解,我们需要将人类难以理解的64维特征表达进行降维处理以实现可视化。t-SNE是一种专门用于降低高维数据复杂度的方法,我们在这里使用它。它生成一个二维图,相似节点之间紧密地聚集在一起,而这个图是通过输出仅包含两个元素的概率分布向量实现的。

# 定义函数:可视化Nodes2Vec的结果def visualize_results(embeddings, labels):    # 使用t-SNE对数据进行降维并绘图    tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300)    tsne_results = tsne.fit_transform(embeddings)    plt.figure(figsize=(10, 5))    plt.scatter(tsne_results[:,0], tsne_results[:,1], c=labels)    plt.colorbar()    plt.show()# 可视化结果visualize_results(cora_embeddings, cora_labels)
登录后复制

Node2Vec生成的嵌入向量将被输入到t-SNE中,其中t-SNE将64维向量表达进行了降维,并输出我们可以使用 matplotlib 库可视化的二维散点图。大多数相关节点是否紧密聚集,可以在图形界面中进行检查。

以上就是python基于Node2Vec怎么实现节点分类及其可视化的详细内容,更多请关注易企推科技其它相关文章!


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/1151049.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • 奇异值分解(SVD)简介及其在图片压缩中的示例

    奇异值分解(SVD)简介及其在图片压缩中的示例

    奇异值分解(SVD)是一种用于矩阵分解的方法。它将一个矩阵分解为三个矩阵的乘积,分别是左奇异向量矩阵、右奇异向量矩阵和奇异值矩阵。SVD在数据降维、信号处理、推荐系统等领域广泛应用。通过SVD,我们可以将高维数据降低到低维空间,从而提取出数...

  • 用U盘轻松实现一键重装系统的小白装机教程

    用U盘轻松实现一键重装系统的小白装机教程

    在现代社会,电脑已经成为人们生活中不可或缺的工具。然而,由于各种原因,我们有时候需要重装电脑系统来解决一些问题或提升性能。但是,对于一些小白用户来说,重装系统可能是一项困难的任务。因此,本文将介绍一款小白一键重装系统的u盘装机教程,帮助小白...

  • ppt中怎么插入自定义动作按钮

    ppt中怎么插入自定义动作按钮

    ppt插入自定义动作按钮: 打开幻灯片文件,然后在菜单栏中点击插入,打开插入工具栏,之后在插入工具栏中选择形状工具,如下图所示:点击形状工具后,就打开所有预置的形状列表,如下图所示,选择我们需要的形状。选择好形状后,自动退回到ppt文件编辑...

  • 主板显卡卡扣断了怎么办

    主板显卡卡扣断了怎么办

    主板显卡卡扣断了可以尝试使用胶带或胶水将其固定、更换显卡插槽、更换主板或者寻求专业人员的帮助。详细介绍:1、使用胶带或胶水将其固定,使用胶带或胶水时要小心,以免粘到其他部件上;2、更换显卡插槽,建议找专业的电脑维修人员来进行操作;3、更换主...

  • abc类ip地址怎么区分

    abc类ip地址怎么区分

    区分方法:1、a类ip地址,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;2、b类ip地址,前两段号码为网络号码;3、c类ip地址,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。本教程操作环境:windows7系统、De...

  • jsp文件怎么创建

    jsp文件怎么创建

    创建jsp文件的步骤:1、安装和配置java开发环境;2、安装和配置web服务器;3、创建jsp文件;4、编写jsp代码;5、部署和运行应用程序;6、调试和测试。详细介绍:1、安装和配置java开发环境,首先需要在计算机上安装jdk,可以从...

  • win7升级错误代码80072efe该怎么办win7升级错误代码80072efe解决...

    win7升级错误代码80072efe该怎么办win7升级错误代码80072efe解决方案

    win7客户在系统更新的过程中遇到了80072efe的报错,像这种状况要怎么办呢?你先清查网络问题,然后去微软官网下载代理,假如你用的是32位计算机就免费下载32位代理,安装下载完成后马上重启。假如再次出现升级不正确得话,你也就再去官方网站...

  • git怎么合并分支代码

    git怎么合并分支代码

    git合并分支代码的方法:1、使用“gitmerge”命令,该命令用来做分支合并,可以将其他分支中的内容合并到当前分支中。2、使用“gitrebase”命令,该命令用于改变当前的分支的基点,进而实现分支合并。本教程操作环境:Window...

  • 周排行
  • 月排行
  • 年排行

精彩推荐