Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie die Knotenklassifizierung und -visualisierung in Python basierend auf Node2Vec

So implementieren Sie die Knotenklassifizierung und -visualisierung in Python basierend auf Node2Vec

PHPz
PHPznach vorne
2023-06-01 20:05:101225Durchsuche

Einführung

Node2vec ist eine Methode zum Einbetten von Diagrammen, die für Aufgaben wie Knotenklassifizierung, Community-Erkennung und Verbindungsvorhersage verwendet werden kann.

Implementierungsprozess

Laden des Datensatzes

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)

Diese Funktion integriert die Knotenmerkmale in 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 Node2vec

Um 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())

Durch den obigen Code können wir den 64-dimensionalen Knoteneinbettungsausdruck jedes Knotens erhalten.

Klassifikatoren trainieren

Als nächstes werden wir einige Klassifikatoren spezifizieren und sie anhand des Cora-Datensatzes trainieren, um genaue Knotenklassifizierungsoperationen basierend auf Einbettungen durchzuführen.

# 定义函数:可视化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)

Um eine bessere Leistung zu erzielen, müssen wir bei Verwendung der Support-Vektor-Maschine als Klassifikator auch entsprechende Parameteranpassungsvorgänge durchführen. Hier wird eine 5-fache Kreuzvalidierungsmethode verwendet, um die Leistung zu bewerten.

Visualisierung der Knoteneinbettung

Für ein besseres Verständnis müssen wir die Dimensionalität des 64-dimensionalen Merkmalsausdrucks reduzieren, der für Menschen schwer zu verstehen ist, um eine Visualisierung zu erreichen. t-SNE ist eine Methode, die speziell zur Reduzierung der Komplexität hochdimensionaler Daten entwickelt wurde und die wir hier verwenden. Es generiert einen zweidimensionalen Graphen, in dem ähnliche Knoten eng beieinander liegen, indem ein Wahrscheinlichkeitsverteilungsvektor ausgegeben wird, der nur zwei Elemente enthält.

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen