前提・実現したいこと
Pythonで勉強がてらクラスタリング係数を求めるプログラムを作成しています。
今後これを他の言語に移植していこうと考えているのでできるだけライブラリを使わずに作りたいと思っています。
http://www.orsj.or.jp/~wiki/wiki/index.php/クラスタ係数
上のサイトを頼りに組んでみましたが、その関数の出力結果がnetworkxの平均クラスタリング係数と違ってしまいます。
networkxのコードも読みましたが、自分には読めるほどの技術がありませんでした。
def Graph_clus_ave(df): name_dic={} #ここから下はグラフの隣接行列 cnt=0; for index,row in df.iterrows(): #ここで名前に数値を振る。 if((row["a"] in name_dic.keys())==False): name_dic[row["a"]]=cnt cnt+=1 if((row["b"] in name_dic.keys())==False): name_dic[row["b"]]=cnt cnt+=1 vec = [[0 for i in range(cnt)] for j in range(cnt)] for index,row in df.iterrows(): vec[name_dic.get(row["a"])][name_dic.get(row["b"])]=1 vec[name_dic.get(row["b"])][name_dic.get(row["a"])]=1 clus=0#ここからクラスタリング係数を計算していきます。 v=[sum(vec[i]) for i in range(cnt)] for i in range(cnt): clus_sum=0 for j in range(cnt): if(vec[i][j]==1): for k in range(cnt): if(vec[i][k]==1 and vec[j][k]==1): clus_sum+=1 if(v[i]>1): clus+=clus_sum/(v[i]*(v[i]-1)) ###2回カウントされるのでclus_sum/2だが、v[i]*(v[i]-1)/2の2と相殺される### return clus/cnt
どこをどのように直せばいいのかもわからない状況です。
みなさまのお力をお貸しください。
お願いします。
試したこと
nx.average_clustering(G,count_zeros=None)を試したが、やっぱり値は違かった。
コンプリートグラフではキチンと1を返してくれます。
しかし他の生成したグラフでは違う値だったので処理自体に問題があるのだと思います。
例:G= nx.fast_gnp_random_graph(6, 0.5)で生成したグラフ
networkx:0.5
自作関数:0.25
###補足
使用したデータセットは重複データあるデータセットでした。
a | b |
---|---|
Aさん | Bさん |
Cさん | Dさん |
Aさん | Cさん |
Dさん | Aさん |
... | ... |
みたいな感じです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。