Node2vec ist eine Methode zum Einbetten von Diagrammen, die für Aufgaben wie Knotenklassifizierung, Community-Erkennung und Verbindungsvorhersage verwendet werden kann.
Lassen Sie uns zunächst die erforderliche Python-Bibliothek laden und den folgenden Code ausführen, um den Cora-Datensatz zu laden:
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]
wobei cora.content
alle Informationen zu Knotenfunktionen enthält , mit insgesamt 2708 Knoten und 1433 Features; und cora.cites
verwendet Zitatzuordnung, um eine gerichtete Kantenbeziehung zwischen Knoten für jeden der Knoten herzustellen, mit insgesamt 5429 Kanten. Als nächstes müssen wir Knotenmerkmale und Referenzinformationen zusammenführen, um die Diagrammstruktur aufzubauen. 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
mit den gerichteten Kanten von cora.cites
und beschriftet sie im Diagramm. Jetzt haben wir eine grafische Ansicht erstellt, die es uns ermöglicht, unsere Ideen zu visualisieren. Einbetten von Daten mit Node2vecUm die Knotenmerkmalsklassifizierung durchzuführen, müssen wir einige Informationen aus dem Netzwerk extrahieren und sie als Eingabe an den Klassifikator übergeben. Ein Beispiel ist die Verwendung der Knoten-2-Vektormethode, um die extrahierten Informationen in einen Vektorausdruck umzuwandeln, sodass jeder Knoten mindestens eine Dimension hat. Durch die Entnahme von Zufallsstichproben vom Startknoten zum Zielknoten lernt das Node2Vec-Modell einen Vektor, der jeden Knoten darstellt. Das Node-2Vec-Modell definiert die Übergangswahrscheinlichkeiten zwischen Knoten während eines Random Walk. Wir werden die Bibliothek node2vec verwenden, um eine eingebettete Darstellung des Diagramms zu generieren und ein neuronales Netzwerk zur Knotenklassifizierung verwenden. 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
Der von Node2Vec generierte Einbettungsvektor wird in t-SNE eingegeben, wobei t-SNE die Dimensionalität des 64-dimensionalen Vektorausdrucks reduziert und ein zweidimensionales Streudiagramm ausgibt, das wir mithilfe der Matplotlib-Bibliothek visualisieren können. Ob die meisten relevanten Knoten eng geclustert sind, kann in der grafischen Oberfläche überprüft werden. 🎜Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Knotenklassifizierung und -visualisierung in Python basierend auf Node2Vec. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!