Bipartite Graph : 이종 그래프
✔️ 다른 종류의 정점사이에만 간선이 연결됨
✔️ 전자 상거래 구매내역(사용자, 상품), 학교(학생과 선생님)그래프 등이 이에 해당한다.
그래프의 표기법
정점들의 집합을 , 간선들의 집합을, 그래프를 로 표현한다.
정점의 이웃(Neighbor)
정점의 이웃이란 정점과 연결된 다른 정점을 의미한다.
✔️ 정점 의 이웃들의 집합을 또는 등의 표기로 표기한다.
✔️ 방향성이 있는 그래프에서는 나가는 이웃들과 들어오는 이웃을 구분한다.
✔️ 정점 에서 간선이 나가는 이웃(Out- Neighbor)의 집합을 보통 로 표시하고 들어오는 이웃(In-Neighbor)의 집합을 보통 로 표시한다.
그래프의 종류와 유형
간선 리스트(Edge list) : 그래프를 간선들의 리스트로 저장, 각 간선은 해당 간선이 연결하는 주 정점들의 순서쌍(pair)으로 저장(방향성이 있는 경우 (출발점, 도착점)순서로 저장)
인접 리스트(Adjacent list) : 각 정점의 이웃들을 리스트로 저장(방향성이 있는 경우 나가는 이웃들과 들어오는 이웃들을 각각 리스트로 저장)
인접 행렬 : 2차원 배열을 통해 저장
#networkx 라이브러리 예시
import networkx as nx
G = nx.Graph()
ListGraph = nx.to_dict_of_lists(G) # 인접 리스트
EdgeListGraph = nx.to_edgelist(G) # 간선 리스트
NumpyArrayGraph = nx.to_numpy_array(G) # 인접 행렬(일반 행렬)
SparseMatrixGraph = nx.to_scipy_sparse_matrix(G) # 인접 행렬(희소 행렬)
경로(path)
정점 와 의 사이의 경로(path)는 다음과 같은 조건을 만족하는 정점들의 순열(Sequence)이다.
✔️ 에서 시작해서 에서 끝나야 한다.
✔️ 순열에서 연속된 정점은 간선으로 연결되어 있어야 한다.
길이
경로의 길이는 해당 경로 상에 놓이는 간선의 수로 정의
거리(Distance)
정점 와 의 사이의 거리(Distance)는 와 사이의 최단 경로의 길이이다.
지름(Diameter)
그래프의 지름(Diameter)은 정점 쌍의 거리 간 최댓값이다.
def getGraphDiameter(Graph):
diameter = 0
for v in Graph.nodes:
length = nx.single_source_shortest_path_length(Graph, v)
max_length = max(length.values())
if max_length > diameter:
diameter = max_length
return diameter
작은 세상 효과란 무었일까?
어떠한 관계에 있어 몇 단계만 거치면 서로 연결되어 있다는 이론이다.
실제 예시로는 여섯 단계 분리(Six Degrees of Separataion) 실험, MSN메신저를 예시로 들 수 있다.
✔️ 작은 세상 효과는 실생활을 표현한 그래프에서는 물론 높은 확률로 랜덤 그래프에도 존재한다.
특정한 그래프(체인(Chain), 사이클(Cycle), 격자(Grid) 그래프)에서는 작은 세상 효과가 존재하지 않는다.
출처: Naver BoostCamp AI Tech - edwith 강의
연결성(Degree)
정점의 연결성(Degree)은 그 정점과 연결된 간선의 수를 의미한다.
✔️ 정점 의 연결성은 해당 정점의 이웃들의 수와 같고 표기는 , , 같은 표기법으로 표현한다.
✔️ 방향성이 있는 그래프에서는 나가는 연결성(Degree)과 들어오는 연결성(Degree)을 구분한다.
✔️ 정점 v에서 나가는 연결성(Out Degree)은 에서 나가는 간선의 수를 의미하며 혹은 로 표시하며 들어오는 연결성(In Degree)은 들어오는 간선의 수를 의미하며 혹은 으로 표시한다.
실제 그래프의 연결성 분포는 두터운 꼬리(Heavy Tail)를 가지나 랜덤 그래프의 연결성 분포는 높은 확률로 정규 분포와 유사하다.
(이때, 연결성이 매우 높은 정점은 허브(Hub)정점이라 하며 랜덤 그래프는 허브 정점이 존재할 가능성이 0에 가깝다.)
출처: Naver BoostCamp AI Tech - edwith 강의
(두터운 꼬리 예시 => 인스타그램의 팔로워 수는 극단적으로 많은 사람은 드물다.)
연결 요소(Connected Component)
연결요소(Connected Component)는 다음과 같은 정점들의 집합을 의미한다.
✔️ 연결 요소에 속하는 정점들은 경로로 연결될 수 없다.
✔️ 위의 조건을 만족하며 정점을 추가 할 수 없다.
실제 그래프에서는 거대 연결 요소(Giant Connected Component)가 존재한다.(거대 연결 요소는 대다수의 정점을 포함)
예시) 어느 메신저 그래프는 99.9%의 정점이 하나의 거대 연결 요소에 포함
출처: Naver BoostCamp AI Tech - edwith 강의
랜덤 그래프는 높은 확률로 거대 연결 요소(Giant Connected Component)가 존재한다.
이때, 정점들의 평균 연결성이 1 보다 충분히 커야 한다.
직관적으로 생각 해 보면 간선이 하나 있어야 연결요소가 생기는데 은 을 간선의 수로 본다면 간선이 생기는 수로 써 볼 수 있다. 따라서, 이 값이 1이 넘어야 급격하게 연결 요소가 생긴다고 생각 할 수 있다.
출처: Naver BoostCamp AI Tech - edwith 강의
참고 : https://brianzhang01.github.io/2018/07/random-graphs-and-giant-components/
군집(Community)
군집(Community)이란 다음 조건들을 만족하는 정점들의 집합이다.
✔️ 집합에 속하는 정점 사이에는 많은 간선이 존재
✔️ 집합에 속하는 정점과 그렇지 않은 정점 사이에는 적은 수의 간선이 존재
지역적 군집 계수(Local Clustering Coefficient)
지역적 군집 계수(Local Clustering Coefficient)는 한 정점에서 군집의 형성 정도를 측정한다.
정점 의 지역적 군집 계수는 정점 의 이웃 쌍 중 간선으로 직접 연결된 것의 비율을 말한다.
정점 의 지역적 군집 계수를 로 표현 할 시 예시는 다음과 같다.
예시)
정점 1의 이웃은 4개(2,3,4,5)이며, 총 6개의 이웃 쌍<이웃으로 만들어 낼 수 있는 쌍>(2,3),(2,4),(2,5),(3,4),(3,5),(4,5)이 존재하고 그 중 3개의 쌍이 간선으로 직접 연결되어(2,3),(2,4),(3,5) 있어 군집계수 는 이다.
(이때, 연결성이 0인 정점에서는 지역적 군집 계수가 정의되지 않는다.)
지역접 군집 계수가 군집이랑 어떻게 연관이 있는 것인가?
✔️ 정점의 지역적 군집 계수가 매우 높으면 이웃들고 높은 확률로 서로 간선으로 연결되어 있고 정점와 그 이웃들은 높은 확률로 군집을 형성한다.
전역 군집 계수(Global Clustering Coefficent)
전역 군집 계수(Global Clustering Coefficent)는 전체 그래프에서 군집의 형성 정도를 측정한다.
그래프의 전역 군집 계수는 각 정점에서의 지역적 군집 계수의 평균이다.(정의되지 않는 정점은 제외)
def getGraphAverageClusteringCoefficient(Graph):
ccs = []
for v in Graph.nodes:
num_connected_pairs = 0
for neighbor1 in Graph.neighbors(v):
for neighbor2 in Graph.neighbors(v):
if neighbor1 <= neighbor2:
continue
if Graph.has_edge(neighbor1, neighbor2):
num_connected_pairs += 1
cc = num_connected_pairs / (Graph.degree(v) * (Graph.degree(v) - 1) / 2) # 분모 - Combination개념을 이용(v에 연결된 정점들 중 2개를 고름)
ccs.append(cc)
return sum(ccs) / len(ccs)
출처: Naver BoostCamp AI Tech - edwith 강의
균일 그래프 : 군집계수 - 크다, 지름 - 크다
작은 세상 그래프 : 군집계수 - 크다, 지름 - 작다
랜덤 그래프 : 군집계수 - 작다, 지름 - 작다
Naver BoostCamp AI Tech - edwith
https://brianzhang01.github.io/2018/07/random-graphs-and-giant-components/