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

NetworkX: current flow betwenness centrality.

๐Ÿ“‘ ๋ชฉ์ฐจ (Contents)

current flow betweenness centrality.

  • ์ด์ „์—, closeness centrality๋ฅผ ์ด์•ผ๊ธฐํ•  ๋•Œ๋„, information centrality๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ, ์ธก์ •ํ•œ ๊ฒƒ์ด ์žˆ์—ˆ์ฃ .
  • betwenness centrality๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ „๋ฅ˜ ๋ชจํ˜•์„ ์ ์šฉํ•˜์—ฌ, graph์—์„œ ์ •๋ณด๊ฐ€ ํ๋ฅผ ๋•Œ, ๊ฐ node๋ฅผ ์–ผ๋งˆ๋‚˜ ์ง€๋‚˜๊ฐ€๋Š”์ง€๋ฅผ ์ธก์ •ํ•œ, current flow betweenness centrality๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ๋ง๋กœ random-walk betweenness centrality๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•˜์ฃ .

Do it.

  • ๋Š˜ ๋งํ•˜์ง€๋งŒ, betweenness centrality๋‚˜, current flow betwenness centrality๊ฐ’ ์ž์ฒด๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, current flow์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋งŽ์ด ๊ฑธ๋ฆฌ๋„ค์š” ํ . ์ด๊ฑด, ์ด์ „์— current closeness centrality๊ฐ€ closeness centrality์— ๋น„ํ•ด์„œ ํ›จ์”ฌ ์งง์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜ ๊ฒƒ์— ๋น„ํ•˜๋ฉด, ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
  • ํŠนํžˆ, Node์˜ ๊ฐœ์ˆ˜๋ฅผ 1000๊ฐœ๊นŒ์ง€ ์˜ฌ๋ฆฌ๋ฉด, ๋” ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ์ฐจ์ด๊ฐ€ ๋‚˜์ฃ .
import networkx as nx
import numpy as np
import time

def Derive_CORR_from_TWO_CENT_DICT(dict_A, dict_B):
    # nx.centrality์˜ ๊ฒฐ๊ณผ์ธ dictionary(nodename: cent_value) 2๊ฐœ๋ฅผ input์œผ๋กœ 
    # correlation์„ ๋ฆฌํ„ดํ•จ 
    A_np = np.array([*dict_A.values()])
    A_np /= np.linalg.norm(A_np)

    B_np = np.array([*dict_B.values()])
    B_np /= np.linalg.norm(B_np)
    return np.correlate(A_np, B_np)[0]

np.random.seed(0)

N = 300  # node size
p = 0.4
G = nx.fast_gnp_random_graph(N, p, seed=0)

print("==" * 30)
# exact betweenness centrality
bet_time = time.time()
nx_bet_dict = nx.betweenness_centrality(G)
bet_time = time.time() - bet_time
print(f"exact betweenness cent calc time          : {bet_time: .4f} sec")

# current flow betweenness centrality
cur_bet_time = time.time()
nx_current_bet_dict = nx.current_flow_betweenness_centrality(G)
cur_bet_time = time.time() - cur_bet_time
print(f"current flow-between cent calc time       : {cur_bet_time: .4f} sec")

# approximation current flow betweenness centrality
aprox_cur_bet_time = time.time()
aprox_nx_current_bet_dict = nx.approximate_current_flow_betweenness_centrality(G)
aprox_cur_bet_time = time.time() - aprox_cur_bet_time
print(f"approx current flow-between cent calc time: {aprox_cur_bet_time: .4f} sec")
print("==" * 30)

# np.corr
bt_curbt_corr = Derive_CORR_from_TWO_CENT_DICT(nx_bet_dict,nx_current_bet_dict)
print(f"CORRELATION of BET and CURRENT_BET       : {bt_curbt_corr:7.5f}")
bt_aprcurbt_corr = Derive_CORR_from_TWO_CENT_DICT(nx_bet_dict, aprox_nx_current_bet_dict)
print(f"CORRELATION of BET and APPROX CURRENT_BET: {bt_aprcurbt_corr:7.5f}")

print("==" * 30)
  • ์ฆ‰, ์•„๋ž˜์—์„œ ๋ณด์‹œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, approximation์ด ๊ทธ๋ƒฅ betweeness centrality๋ณด๋‹ค ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
============================================================
exact betweenness cent calc time          :  2.5393 sec
current flow-between cent calc time       :  19.6670 sec
approx current flow-between cent calc time:  5.1184 sec
============================================================
CORRELATION of BET and CURRENT_BET       : 0.99629
CORRELATION of BET and APPROX CURRENT_BET: 0.99044
============================================================

wrap-up

  • current flow ์‹œ๋ฆฌ์ฆˆ๋Š” ๋Œ€์ƒ์„ โ€œ์ „๋ฅ˜๋ชจํ˜•โ€์œผ๋กœ ๋ชจ๋ธ๋งํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ด๊ฒฝ์šฐ๋Š” ๋ผํ”Œ๋ผ์Šค ๋ณ€ํ™˜์„ ์ด์šฉํ•ด์„œ, ๊ณ„์‚ฐํ–ˆ๋˜ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ตํ•˜๋Š”๋ฐ, ํ•˜๋‚˜ํ•˜๋‚˜ shortest_path๋ฅผ ์ฐพ์œผ๋ฉด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ betweenness centrality๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์ด์ƒํ•˜๊ฒŒ ๋А๊ปด์ง€๋„ค์š”.

reference

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

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