본문 바로가기
Data & Research

[Graph Neural Networks] NetworkX & Pytorch Geometric

by TrillionNT 2024. 11. 21.

복잡한 딥러닝 구조에서 그래프를 다루기 전에 NetworkX, Pytorch Geometric 패키지를 이용해서 기본적인 그래프 속성을 다루는 연습을 해보겠습니다. 

 

1. NetworkX

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

# 노드와 엣지 리스트 정의
node_list = [1, 2, 3, 4, 5]
edge_list = [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), 
             (2, 1), (2, 3), (2, 5),
             (3, 1), (3, 2),  
             (4, 1),
             (5, 1), (5, 2)]

# 그래프 생성
G = nx.Graph()
G.add_nodes_from(node_list)
G.add_edges_from(edge_list)

# 그래프 속성 출력
print(f"Nodes: {G.nodes}")
print(f"Edges: {G.edges}")

# 인접행렬 생성
adj_matrix = nx.adjacency_matrix(G).todense()
print("Adjacency Matrix:")
print(adj_matrix)

# 그래프 시각화
custom_labels = {1: "Seoul", 2: "Daejeon", 3: "Daegu", 4: "Busan", 5: "Gwangju"}
plt.figure(figsize=(6, 6))
nx.draw(G, with_labels=True, labels=custom_labels, node_color='lightblue', node_size=1500, font_size=16, font_weight='bold')
plt.title("Big Cities in Korea")
plt.show()

# 기본 분석
degree_sequence = [d for n, d in G.degree()]
average_degree = np.mean(degree_sequence)
density = nx.density(G)
print(f"Degree sequence: {degree_sequence}")
print(f"Average degree: {average_degree}")
print(f"Density: {density}")

 

2. Pytorch Geometric

import torch
from torch_geometric.data import Data

# 노드와 엣지 리스트 정의 (0-based index 사용)
edge_index = torch.tensor([
    [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4],
    [0, 1, 2, 3, 4, 0, 2, 4, 0, 1, 0, 0, 1]
], dtype=torch.long)

# 노드 특징 생성 (예: 각 노드에 2차원 특징 부여)
x = torch.tensor([
    [1, 0],
    [0, 1],
    [1, 1],
    [0, 0],
    [1, 0]
], dtype=torch.float)

# 그래프 데이터 생성
data = Data(x=x, edge_index=edge_index)

# 데이터 확인
print("Graph Data:")
print(data)
print(f"Number of nodes: {data.num_nodes}")
print(f"Number of edges: {data.num_edges}")
print(f"Node features:\n{data.x}")
print(f"Edge index:\n{data.edge_index}")

# 그래프 분석
degree = torch.bincount(data.edge_index[0])
print(f"Node degrees: {degree}")

# 밀도 계산
num_possible_edges = data.num_nodes * (data.num_nodes - 1)
density = data.num_edges / num_possible_edges
print(f"Graph density: {density}")

 

3. NetworkX / Pytorch Geometric 간 변환

from torch_geometric.utils import from_networkx

# NetworkX에서 Karate Club 그래프 로드
G = nx.karate_club_graph()

# NetworkX 그래프를 PyTorch Geometric 그래프로 변환
data = from_networkx(G)

# PyTorch Geometric 데이터 확인
print("PyTorch Geometric Data from NetworkX:")
print(data)
print(f"Number of nodes: {data.num_nodes}")
print(f"Number of edges: {data.num_edges}")