그래프 기본 개념

민죵·2024년 9월 2일
0

GNN공부

목록 보기
4/12

https://ysg2997.tistory.com/26 링크를 보며 공부한 내용 입니다.

Directed Graph와 UnDirected Graph를 Networkx를 이용하여 그려본다.


!pip install networkx

import networkx as nx
import matplotlib.pyplot as plt

# Directed graph
DG = nx.DiGraph()  #nx로 DirectGraph객체 생성
DG.add_edges_from([('A','B'),('A', 'C'), ('B', 'D'), ('B', 'E'), ('C', 'F'), ('C', 'G')])  # Direct Graph 객체에 N1->N2 엣지 추가

plt.axis('off')
nx.draw_networkx(DG,
                 pos = nx.spring_layout(DG, seed = 0), # 그래프 레이아웃을 정의
                 node_size = 600,
                 cmap= 'coolwarm',
                 font_size = 14,
                 font_color = 'white')

실행 결과


# Undirected graph
 
G = nx.Graph()
G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), ('B', 'E'), ('C', 'F'), ('C', 'G')])
 
plt.axis('off')
nx.draw_networkx(G,
                 pos=nx.spring_layout(G, seed=0),
                 node_size=600,
                 cmap='coolwarm',
                 font_size=14,
                 font_color='white'
                 )
               

실행 결과

  • NetworkX와 Matplotlib의 관계
    : NetworkX를 사용하여 그래프를 정의하고, Matplotlib를 사용하여 그 그래프를 시각화 한다. (NetworkX의 draw_networkx 함수는 내부적으로 Matplotlib를 사용하여 그래프를 화면에 그린다. 하지만 Networkx자체가 Matplotlib에 의존하지는 않는다.)
  • plt.show()를 호출하지 않더라도 그래프를 그리는 부분이 수행된다. 그러나 그려진 그래프를 화면에 실제로 표시하려면 plt.show()를 호출해야한다.
    : 그런데 왜 그래프가 보일 수 있을까? Jupyter Notebook과 같은 인터랙티브 환경세서는, 코드 셀의 마지막 줄에 draw_networkx 와 같은 플로팅 명령어가 있을 경우, 자동으로 그려진 그래프가 표시된다. 이경우, plt.show()를 호출하지 않아도 결과를 볼 수 있다. (즉, 스크립트 파일(.py)를 사용하는 경우에는 그래프를 제대로 표시하려면 plt.show()를 호출하는 것이 좋다. 주피터노트북과 같은 인터랙티브 환경에서는 자동으로 그래프가 표시될 수있지만, 가독성과 일관성을 위해서 plt.show()를 호출하는 것도 좋다. )
    => 결론
    draw_networkx는 그래프를 그리기 위한 함수이며, 그려진 그래프를 실제로 화면에 표시하기 위해서는 plt.show()를 호출해야 합니다. 인터랙티브 환경에서는 자동으로 표시되기도 하지만, 스크립트나 기타 환경에서는 plt.show()가 필요합니다.
  • nx.sprint_layout(DG, seed =0)
    : 노드의 레이아웃(위치) 를 결정한다.
    = 첫번째 매개변수 DG(필수): 레이아웃을 적용할 NetworkX그래프 객체, 이 객체는 노드와 엣지를 포함하고 있어야 한다.
    = 두번째 매개변수 seed(선택적) : 난수 시드이다. 레이아웃의 결과를 재현 가능하게 만들기 위해 사용된다.동일한 시드면 동일한 레이아웃 얻을 수 있다.

    Weighted Graph 그려보기

    각각의 엣지에 가중치 or 비용을 할당한 그래프를 그린다.

    
    # Weighted graph
    
     WG = nx.Graph()
     WG.add_edges_from([('A', 'B', {"weight": 10}), ('A', 'C', {"weight": 20}), ('B', 'D', {"weight": 30}), ('B', 'E', {"weight": 40}), ('C', 'F', {"weight": 50}), ('C', 'G', {"weight": 60})])
     labels = nx.get_edge_attributes(WG, "weight") #엣지의 가중치 가져오기 엣지의 가중치를 딕셔너리 형태로 가져온다. {(노드1, 노드2): 가중치} 형식이다.
    
     plt.axis('off')
     
     # 그래프 시각화
     nx.draw_networkx(WG,
                      pos=nx.spring_layout(WG, seed=0),
                      node_size=600,
                      cmap='coolwarm',
                      font_size=14,
                      font_color='white'
                      )
    
     # 엣지의 가중치 라벨을 추가합니다
     nx.draw_networkx_edge_labels(WG, nx.spring_layout(WG, seed=0), edge_labels=labels, font_color='red')
     plt.show()

그 외 그래프들

  • Connected Graph
  • Rooted Graph
  • Directed acyclic graph: 순환없는 방향 그래프
  • Bipartite graph: 특히 추천 시스템에서 유저와 아이템 간의 관계를 나타낼 때 유용한 개념.
  • Complete graph: 모든 노드들이 서로 연결된 그래프.

그래프 표현법

  • Adjacency matrix
  • Edge list: edge_list= [(0,1), (0,2)]
  • Adjacency list
    {
    0: [1,2],
    1: [0,3,4],
    2: [0,5,6],
    ...
    }

그래프 탐색 알고리즘: BFS, DFS

그래프 측정

: 그래프의 노드나 엣지에 대한 중요성이나 중심성을 측정하는 방법. 그래프의 구조와 연결성을 분석하고 이해하는데 필요하다.

  • 연결중심성(Degree centrality): 특정노드의 연결된 엣지 수를 해당 노드의 중심성으로 간주한다. 해당 값이 높을 수록 해당 노드는 그래프 내에서 중요한 역할을 한다는 것을 의미한다. 네트워크에서의 사회적인 영향력이나 정보 전달의 중심 등을 측정하는데 사용된다.
  • 근접 중심성(Closeness centrality): 특정 노드와 다른 노드간의 근접성을 측정하는 방법이다. 특정 노드에서 다른 모든 노드까지의 최단 경로의 평균 거리를 해당 노드의 중심성으로 간주한다. closeness centrality가 높을 수록 해당 노드는 다른 노드와의 근접성이 높으며, 정보의 전달이 빠르고 효율적으로 이루어질 가능성이 높다.
  • 매개 중심성(Betweenness centrality): 그래프 내에서 특정 노드가 다른 노드들 간의 최단 경로 상에서 얼마나 중간에 위치하는지를 측정하는 방법.특정 노드가 다른 노드들 간의 통로 역할을 하는 정도를 측정한다. Betweeness centrality가 높은 노드는 병목 현상의 중간 지점으로 이해될 수 있으며, 다른 노드들 간의 통신, 정보 전달, 영향력 전파 등에서 중개자 역할을 수행한다.

 
G = nx.Graph()
G.add_edges_from([('A', 'B'), ('A', 'C'), ('B', 'D'), ('B', 'E'), ('C', 'F'), ('C', 'G')])
 
plt.axis('off')
nx.draw_networkx(G,
                 pos=nx.spring_layout(G, seed=0),
                 node_size=600,
                 cmap='coolwarm',
                 font_size=14,
                 font_color='white'
                 )
print(f"Degree centrality      = {nx.degree_centrality(G)}")
print(f"Closeness centrality   = {nx.closeness_centrality(G)}")
print(f"Betweenness centrality = {nx.betweenness_centrality(G)}")
plt.show()
  

profile
빅데이터 / 인공지능 석사 과정 (살아남쨔 뀨륙뀨륙)

0개의 댓글