【ネットワーク解析】
np.random.choice():replace=Falseで重複なし
今日はWatts-Strogatzモデルのネットワークを作成する関数。
ちゃんと作れているのかの検証が出来ないのでなんともいえないのだが、とりあえず何か隣接行列っぽいものを出力してくれる。Pythonでネットワークを可視化してくれるやつ絶対あるだろうし、その手のパッケージを探したほうがいいんだろう。いいんだろうけども、そんなん絶対WSモデル作る奴なんてあるだろうし、そういう意味で調べたら負けだと思っているが無駄である。
--------------------------------------------
import numpy as np
def mk_WSmodel(N, k_half, p, matrix):
list=reorder(mk_extended_cycle(N, k_half, matrix=False))
change_index=np.random.choice(list.shape[0], np.int(list.shape[0]*p), replace=False)
for index in change_index:
match=match_list(list, index, N)
list[index, 1]=match[np.random.choice(match.shape[0], 1)]
if matrix:
list=list2matrix(list)
return list
def mk_extended_cycle(N, k_half, matrix):
list=np.zeros(2).reshape(1, 2)
for i in range(N):
j=1
while j<=k_half:
list=np.r_[list, np.array([i, i+j]).reshape(1, 2)]
j=j+1
list=list[1:, :]%N
if matrix:
list=list2matrix(list)
return list
def reorder(list):
for i in range(list.shape[0]):
if zero_one()==1:
temp=list[i, 0]
list[i, 0]=list[i, 1]
list[i, 1]=temp
return list
def match_list(list, index, N):
match=np.ones(N)
match[np.int(list[index, 0])]=0
for i in range(list.shape[0]):
if list[i, 0]==list[index, 0]:
match[np.int(list[i, 1])]=0
elif list[i, 1]==list[index, 0]:
match[np.int(list[i, 0])]=0
return np.arange(0, N, 1)[match==1]
def zero_one():
return np.random.choice(2, 1)
def list2matrix(list):
link=np.zeros(N*N).reshape(N, N)
for i in range(list.shape[0]):
link[np.int(list[i, 0]), np.int(list[i, 1])]=1
link[np.int(list[i, 1]), np.int(list[i, 0])]=1
return link
0 件のコメント:
コメントを投稿