4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Barabasi Albert model (BAモデル) を Python で 10行で書いてみた。

Posted at

Motive

約10年くらい前にscilabで簡単な複雑ネットワークモデルを作成したのですが、packageが豊富で学習コストが比較的低いpythonで実装してみました。

Algoryism

  1. 初期値は2つのノード(点 or dot)を用意してエッジ(線)でつなぐ

  2. ノードが一つ増える。元からあるノードを一つ選び、新しくできたノードとつなぐ。

    • この時の選び方は各ノードが持つエッジの数(次数)に依存する。

      例)
    ノード 所有しているエッジ数 次の新しいノードにつながる確率
    0 1 1/10     10%
    1 2 2/10     20%
    2 3 3/10     30%
    3 2 2/10     20%
    4 1 1/10     10%
    5 1 1/10     10%

    Figure_1.png

  3. 2をひたすら繰り返す

Development

パッケージを含めて10行です。

import random
__TRAINING_COUNT__ = 100
pile, edges= [1,1], [(0,1)]
for i in range(__TRAINING_COUNT__ ):
	board = sum([[i] * p for i,p in enumerate(pile)], [])
	node = random.choice(board)
	pile[node] = pile[node] + 1
	pile.append(1)
	edges.append((node, len(pile) - 1))
print("pile:{}, edge:{}".format(pile, edges))

新しくノードにつなぐ部分ですが単純に次数分のノードNoを配列に格納してランダムで取得しています。

sum([[i] * p for i,p in enumerate(pile)], [])

ものすごいnodeがあった場合は配列が崩壊しそうです。他にいい方法はないかと考え中です。

Conclusion

pile:[7, 12, 1, 2, 15, 9, 5, 9, 1, 4, 3, 2, 3, 3, 2, 1, 3, 2, 2, 2, 1, 1, 1, 5, 2, 5, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 5, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
edge:[(0, 1), (1, 2), (1, 3), (1, 4), (1, 5), (0, 6), (1, 7), (1, 8), (4, 9), (5, 10), (1, 11), (10, 12), (4, 13), (5, 14), (9, 15), (5, 16), (5, 17), (12, 18), (14, 19), (4, 20), (0, 21), (4, 22), (6, 23), (19, 24), (6, 25), (13, 26), (11, 27), (0, 28), (4, 29), (7, 30), (23, 31), (16, 32), (30, 33), (6, 34), (16, 35), (4, 36), (25, 37), (23, 38), (23, 39), (0, 40), (1, 41), (7, 42), (27, 43), (24, 44), (0, 45), (4, 46), (4, 47), (7, 48), (25, 49), (13, 50), (37, 51), (4, 52), (44, 53), (1, 54), (4, 55), (4, 56), (27, 57), (7, 58), (23, 59), (18, 60), (40, 61), (25, 62), (10, 63), (7, 64), (44, 65), (62, 66), (54, 67), (44, 68), (5, 69), (1, 70), (44, 71), (12, 72), (50, 73), (7, 74), (60, 75), (3, 76), (7, 77), (6, 78), (17, 79), (9, 80), (68, 81), (57, 82), (5, 83), (5, 84), (7, 85), (84, 86), (67, 87), (4, 88), (9, 89), (51, 90), (1, 91), (43, 92), (25, 93), (66, 94), (4, 95), (92, 96), (4, 97), (86, 98), (0, 99), (5, 100), (77, 101)]

Future

上記をもとにnetworkXで描画、分析でもしてみよう。:thought_balloon:
あとはこのモデルの亜流をいろいろと考えてみます。:construction_worker:
非同期処理のサンプルモデルにも使えそうです。

SNSの普及とともに複雑ネットワークが流行し始めたのは2000年くらいですが、ネットワークの性質を求める方法としてノードの次数グラフや平均最短経路ノードの密度などがありますが、他に一般解・評価方法がまだありそうな気がします。さまざまなジャンルの実データを使って分析する必要がありそうです。

Reference

複雑ネットワーク
Barabási–Albert model

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?