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数据集的图结构 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
の有向辺と統合し、グラフ上でそれらにラベルを付けます。これで、アイデアを視覚化できるグラフィカル ビューが構築されました。
ノード特徴分類を実行するには、ネットワークから情報を抽出し、それを入力として分類器に渡す必要があります。 1 つの例は、ノード 2 ベクトル法を使用して、各ノードが少なくとも 1 つの次元を持つように、抽出された情報をベクトル表現に変換することです。
開始ノードからターゲット ノードまでサンプルをランダムに移動することにより、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 は、高次元データの複雑さを軽減するために特別に設計された手法であり、ここでもそれを使用します。類似したノードが密集した 2 次元グラフを生成します。このグラフは、2 つの要素のみを含む確率分布ベクトルを出力することで実現されます。
# 定义函数:可视化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 を使用して視覚化できる 2 次元の散布図を出力します。図書館。最も関連性の高いノードが緊密にクラスタ化されているかどうかは、グラフィカル インターフェイスで確認できます。
以上がNode2Vec に基づいて Python でノードの分類と視覚化を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。