Node2vec ialah kaedah untuk pembenaman graf yang boleh digunakan untuk tugas seperti pengelasan nod, penemuan komuniti dan ramalan sambungan.
Mula-mula, mari kita muatkan perpustakaan Python yang diperlukan dan laksanakan kod berikut untuk memuatkan set data 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]
Antaranya, cora.content
mengandungi semua maklumat ciri nod, dengan jumlah 2708 nod dan 1433 ciri dan cora.cites
mewujudkan hubungan tepi terarah antara nod melalui pemetaan petikan untuk setiap nod, dengan jumlah 5429 tepi. Seterusnya, kita perlu menggabungkan ciri nod dan maklumat rujukan untuk membina struktur graf.
# 定义函数:构造基于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)
Fungsi ini menyepadukan ciri nod dalam cora.content
dengan tepi terarah cora.cites
dan menandakannya pada graf. Kini kami telah membina paparan grafik yang membolehkan kami menggambarkan idea kami.
Untuk melaksanakan pengelasan ciri nod, kita perlu mengekstrak beberapa maklumat daripada rangkaian dan menghantarnya sebagai input kepada pengelas. Satu contoh ialah menggunakan kaedah vektor nod 2 untuk menukar maklumat yang diekstrak kepada ungkapan vektor supaya setiap nod mempunyai sekurang-kurangnya satu dimensi.
Dengan berjalan sampel secara rawak dari nod permulaan ke nod sasaran, model Node2Vec mempelajari vektor yang mewakili setiap nod. Model nod 2Vec mentakrifkan kebarangkalian peralihan antara nod semasa berjalan rawak.
Kami akan menggunakan perpustakaan node2vec untuk menjana perwakilan terbenam graf dan menggunakan rangkaian saraf untuk pengelasan nod.
# 定义函数:创建基于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)
Melalui kod di atas, kita boleh mendapatkan ungkapan pembenaman nod 64 dimensi bagi setiap nod.
Seterusnya kami akan menentukan beberapa pengelas dan melatihnya pada set data Cora untuk melaksanakan operasi pengelasan nod yang tepat berdasarkan pembenaman.
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())
Untuk mendapatkan prestasi yang lebih baik, apabila mesin vektor sokongan digunakan sebagai pengelas, kami juga perlu melakukan operasi pelarasan parameter yang berkaitan. Di sini, kaedah pengesahan silang 5 kali ganda digunakan untuk menilai prestasinya.
Untuk memahami dengan lebih baik, kita perlu mengurangkan dimensi ekspresi ciri 64 dimensi yang sukar difahami oleh manusia untuk mencapai visualisasi. t-SNE ialah kaedah yang direka khusus untuk mengurangkan kerumitan data berdimensi tinggi, dan kami menggunakannya di sini. Ia menghasilkan graf dua dimensi di mana nod serupa dikelompokkan rapat bersama, dan graf ini dicapai dengan mengeluarkan vektor taburan kebarangkalian yang mengandungi hanya dua elemen.
# 定义函数:可视化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)
Vektor benam yang dijana oleh Node2Vec akan dimasukkan ke dalam t-SNE, di mana t-SNE mengurangkan dimensi ekspresi vektor 64 dimensi dan mengeluarkan plot serakan dua dimensi yang boleh kita gambarkan menggunakan matplotlib perpustakaan. Sama ada kebanyakan nod yang berkaitan dikelompokkan dengan ketat boleh disemak dalam antara muka grafik.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan klasifikasi dan visualisasi nod dalam python berdasarkan Node2Vec. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!