ホームページ  >  記事  >  バックエンド開発  >  Node2Vec に基づいて Python でノードの分類と視覚化を実装する方法

Node2Vec に基づいて Python でノードの分類と視覚化を実装する方法

PHPz
PHPz転載
2023-06-01 20:05:101290ブラウズ

はじめに

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 の有向辺と統合し、グラフ上でそれらにラベルを付けます。これで、アイデアを視覚化できるグラフィカル ビューが構築されました。

Node2vec を使用したデータの埋め込み

ノード特徴分類を実行するには、ネットワークから情報を抽出し、それを入力として分類器に渡す必要があります。 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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。