python, pyTorch

torch_geometric.utils

zooyeonii 2021. 8. 11. 14:52

GNN 모델링에 자주 사용되는 모듈 정리 중...(자주 수정됨)

1. to_networkx

to_networkx Converts a torch_geometric.data.Data instance to a networkx.
Graph
 if to_undirected is set to True, or a directed networkx. DiGraph otherwise.

나는 undirected graph를 사용하므로, to_networkx(data).to_undirected() 해준다. 

2. to_undirected

to_undirected Converts the graph given by edge_index to an undirected graph such that (j,i)∈E for every edge (i,j)∈E.

 

Graph generation model option

1. ER graph

erdos_renyi_graph Returns the edge_index of a random Erdos-Renyi graph.

ER graph 는 그래프를 생성하는 모델 중 하나인데, G_(n,p) : 노드 개수가 n, 각 edge 선택될 확률이 p 로, binomial distribution을 따라 생성되는 그래프이다. 그래프의 특성은 clustering coefficient가 낮고, p의 크기에 따라 네트워크의 복잡도나 연결성의 차이가 있다. 적절하게 선택하여 원하는 그래프를 만들 수도 있다. 
특성을 고려할 때, 일반적인 social graph와는 거리가 먼 그래프이다. 

2. Preferential attachment model

barabasi_albert_graph Returns the edge_index of a Barabasi-Albert preferential attachment model, where a graph of num_nodes nodes grows by attaching new nodes with num_edges edges that are preferentially attached to existing nodes with high degree.

social graph 중에서도, facebook 이나 youtube 와 비슷한 형태의 그래프를 생성하는 것이 목표라면, 위의 barabasi_albert_graph를 추천한다. 유튜브나 페이스북을 생각해보면 구독자가 많은, 일종의 셀럽은 극소수이고, 대부분의 노드의 degree는 매우 작을 것이다. (빈익빈 부익부) 이러한 특성을 반영할 수 있는 그래프 생성 모델이다. 
위 모델은, 매 스텝마다 새로운 노드를 선택하여 기존 그래프와 연결하면서 그래프를 키워나간다. 이 때, 기존 그래프에서 새로운 노드와 연결될 노드를 고르는 확률에 따라 다양한 그래프를 생성할 수 있다. 
alpha 확률만큼은 uniform random하게, 1-alpha 만큼은 degree가 큰 애들이 더 많이 뽑히도록 설계되어있다. 따라서 alpha를 낮출수록 극심한 빈부격차를 반영할 수 있을 것이다.

Networkx

  1. Using a stochastic graph generator, e.g,
erdos_renyi_graph(n, p[, seed, directed]) Returns a Gn,p random graph, also known as an Erdős-Rényi graph or a binomial graph.
watts_strogatz_graph(n, k, p[, seed]) Returns a Watts–Strogatz small-world graph.
barabasi_albert_graph(n, m[, seed, …]) Returns a random graph using Barabási–Albert preferential attachment
random_lobster(n, p1, p2[, seed]) Returns a random lobster graph.

>>> er = nx.erdos_renyi_graph(100, 0.15)
>>> ws = nx.watts_strogatz_graph(30, 3, 0.1)
>>> ba = nx.barabasi_albert_graph(100, 5)
>>> red = nx.random_lobster(100, 0.9, 0.9)

'python, pyTorch' 카테고리의 다른 글

그래프 예쁘게 그리기! networkx layout 함수  (0) 2021.08.11
pytorch : txt파일 전처리  (0) 2021.08.11
GNN dataset (dynamic graph)  (0) 2021.08.11
tensorflow-gpu 에러 (해결)  (0) 2021.08.07
torch-geometric install error(2)  (0) 2021.08.06