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())
# 定义函数:可视化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)
rrreee
Node2Vec에서 생성된 임베딩 벡터는 t-SNE에 입력됩니다. 여기서 t-SNE는 64차원 벡터 표현의 차원을 줄이고 matplotlib 라이브러리를 사용하여 시각화할 수 있는 2차원 산점도를 출력합니다. 가장 관련성이 높은 노드가 긴밀하게 클러스터되어 있는지 여부는 그래픽 인터페이스에서 확인할 수 있습니다. 🎜위 내용은 Node2Vec을 기반으로 Python에서 노드 분류 및 시각화를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!