搜尋
首頁後端開發Python教學python基於Node2Vec怎麼實現節點分類及其視覺化

簡介

Node2vec是一種用於圖嵌入(Graph Embedding)的方法,可用於節點分類、社群發現和連結預測等任務。

實作過程 

載入資料集

首先,讓我們載入所需的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怎麼實現節點分類及其視覺化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),