f_
frhyme.code
•python-libs•โฑ ์•ฝ 4๋ถ„ ์†Œ์š”

NetworkX Centrality: local, global reaching centrality.

centrality - local reaching centrality.

  • โ€œlocal reaching centralityโ€๋Š” ๋ง ๊ทธ๋Œ€๋กœ, โ€œ์ ‘๊ทผ๊ฐ€๋Šฅ์„ฑโ€์„ ํ™œ์šฉํ•˜์—ฌ, node์˜ ์ค‘์‹ฌ์„ฑ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. node u์˜ local reaching centrality๋Š” u์—์„œ ๊ทธ๋ž˜ํ”„๋‚ด ๋ชจ๋“  ๋‹ค๋ฅธ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์— ์—ญ์ˆ˜๋ฅผ ์ทจํ•ด์„œ ๊ทธ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ๊นŒ์š”.
  • ์ด๋ ‡๊ฒŒ ์“ฐ๊ณ  ๋ณด๋ฉด harmonic centrality์™€ ๋น„์Šทํ•ด ๋ณด์ด๋Š”๋ฐ, ์•„์ฃผ ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • harmonic centrality: ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ v๋“ค๋กœ๋ถ€ํ„ฐ target node u๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ์—ญ์ˆ˜ ํ•ฉ
    • local reaching centrality: target node u๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ v๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ์—ญ์ˆ˜ ํ•ฉ.
  • ๋”ฐ๋ผ์„œ, undirected network์—์„œ๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ, ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” directed network์—์„œ๋Š” ๊ฐ’์ด ๋ฐ˜๋Œ€๋กœ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋„ค, ๋ฌผ๋ก , ๋ญ ๊ทธ๋‹ค์ง€ ํฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์ฐจ์ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค๋งŒ.

Compute local reaching centrality

import networkx as nx
import numpy as np

def np_normalize_dict(input_dict):
    """
    input_dict: {node_name: centrality_float}์—์„œ 
    value๋ฅผ normalizeํ•˜์—ฌ ๋ฆฌํ„ด.
    """
    vs = np.array(list(input_dict.values()))
    vs /= np.linalg.norm(vs)
    return {k: v for k, v in zip(input_dict.keys(), vs)}

def custom_local_reaching_centraliyt(G, target_node):
    """
    - local reaching centrality
    - target_node์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  node๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์—ญ์ˆ˜๋ฅผ ์ทจํ•ด์„œ ํ•ฉํ•จ.
    harmonic centrality: ๋‹ค๋ฅธ ๋ชจ๋“  node v๋ถ€ํ„ฐ target_node u ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ์—ญ์ˆ˜ ํ•ฉ. 
    """
    path_ls = [1/nx.shortest_path_length(G, target_node, n) for n in G if target_node!=n]
    return sum(path_ls)/(len(G)-1)
# Graph generation
G = nx.DiGraph()
G.add_edges_from([(0, 1), (1, 2)])

# harmonic centrality and normalization
nx_harmonic_cent = nx.harmonic_centrality(G)
nx_harmonic_cent = np_normalize_dict(nx_harmonic_cent)

# global reaching centrality and normalization
nx_node_reaching_centraliy = {n: nx.local_reaching_centrality(G, n) for n in G}
nx_node_reaching_centraliy = np_normalize_dict(nx_node_reaching_centraliy)
for n in G:
    print(
        f"{n:3d} ::: ",
        round(nx_node_reaching_centraliy[n], 8),
        round(nx_harmonic_cent[n], 8))
print("=="*20)
  • ์•„๋ž˜์—์„œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, local_reaching_centrality์™€ harmonic centrality๋Š” ์ˆœ์œ„๊ฐ€ ๋ฐ˜๋Œ€๋กœ ๋‚˜์˜ค๊ฒŒ ๋จ.
  0 :::  0.89442719 0.0
  1 :::  0.4472136 0.5547002
  2 :::  0.0 0.83205029

wrap-up

  • nx.global_reaching_centrality๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋ƒฅ ํ‰๊ท  ๊ฐ’์„ ๊ณ„์‚ฐํ•œ ๊ฒƒ ๊ฐ™์•„์„œ, ์ œ์™ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

reference

๐Ÿ’กRELATED ARTICLES ยท ํ•จ๊ป˜ ์ฝ์œผ๋ฉด ์ข‹์€ ์—ฐ๊ด€ ํฌ์ŠคํŠธ

๊ธ€ ์ฃผ์†Œ๊ฐ€ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.