>  기사  >  백엔드 개발  >  Node2Vec을 기반으로 Python에서 노드 분류 및 시각화를 구현하는 방법

Node2Vec을 기반으로 Python에서 노드 분류 및 시각화를 구현하는 방법

PHPz
PHPz앞으로
2023-06-01 20:05:101224검색

소개

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.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

# 定义函数:创建基于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)

이 함수는 cora.content의 노드 기능을 cora.cites의 유향 가장자리와 통합하고 이를 그래프에 표시합니다. 이제 우리는 아이디어를 시각화할 수 있는 그래픽 보기를 구축했습니다.

Node2vec을 사용하여 데이터 삽입

노드 기능 분류를 수행하려면 네트워크에서 일부 정보를 추출하여 분류기에 입력으로 전달해야 합니다. 한 가지 예는 노드 2 벡터 방법을 사용하여 추출된 정보를 벡터 표현식으로 변환하여 각 노드가 적어도 하나의 차원을 갖도록 하는 것입니다.

시작 노드에서 대상 노드까지 무작위 보행 샘플을 취함으로써 Node2Vec 모델은 각 노드를 나타내는 벡터를 학습합니다. 노드 2Vec 모델은 랜덤 워크 동안 노드 간의 전환 확률을 정의합니다.

우리는 node2vec 라이브러리를 사용하여 그래프의 임베딩 표현을 생성하고 노드 분류를 위해 신경망을 사용합니다.

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())

위의 코드를 통해 각 노드의 64차원 노드 임베딩 표현을 얻을 수 있습니다.

Train classifiers

다음으로 임베딩을 기반으로 정확한 노드 분류 작업을 수행하기 위해 일부 분류자를 지정하고 Cora 데이터세트에서 이를 훈련하겠습니다.

# 定义函数:可视化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)

더 나은 성능을 얻으려면 서포트 벡터 머신을 분류자로 사용할 때 관련 매개변수 조정 작업도 수행해야 합니다. 여기서는 5겹 교차 검증 방법을 사용하여 성능을 평가합니다.

Visualizing Node Embedding

더 나은 이해를 위해서는 인간이 이해하기 어려운 64차원 특징 표현의 차원성을 줄여 시각화를 달성해야 합니다. t-SNE는 고차원 데이터의 복잡성을 줄이기 위해 특별히 설계된 방법이며 여기서는 이를 사용합니다. 두 개의 요소만 포함하는 확률 분포 벡터를 출력하여 유사한 노드가 촘촘하게 모여 있는 2차원 그래프를 생성합니다.

rrreee

Node2Vec에서 생성된 임베딩 벡터는 t-SNE에 입력됩니다. 여기서 t-SNE는 64차원 벡터 표현의 차원을 줄이고 matplotlib 라이브러리를 사용하여 시각화할 수 있는 2차원 산점도를 출력합니다. 가장 관련성이 높은 노드가 긴밀하게 클러스터되어 있는지 여부는 그래픽 인터페이스에서 확인할 수 있습니다. 🎜

위 내용은 Node2Vec을 기반으로 Python에서 노드 분류 및 시각화를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제