2 種類のノードを持つネットワークの Adamic-Adar 類似度を計算しようとしています。私は、発信接続を持つノード間の類似性を計算することにのみ関心があります。着信接続を持つノードは一種のコネクタであり、私はそれらに興味がありません。
データサイズと特徴:
> summary(g)
IGRAPH DNW- 3852 24478 --
+ attr: name (v/c), weight (e/n)
Python 2.7 のプロトタイプ コード:
import glob
import os
import pandas as pd
from igraph import *
os.chdir("data/")
for file in glob.glob("*.graphml"):
print(file)
g = Graph.Read_GraphML(file)
indegree = Graph.degree(g, mode="in")
g['indegree'] = indegree
dev = g.vs.select(indegree == 0)
m = Graph.similarity_inverse_log_weighted(dev.subgraph())
df = pd.melt(m)
df.to_csv(file.split("_only.graphml")[0] + "_similarity.csv", sep=',')
このコードには何か問題があります。dev長さ1は でありm、0.0期待どおりに動作しないためです。
ヒント
私はR で動作するコードを持っていますが、それを Python に書き直すことができないようです (これはパフォーマンスのために行っています。ネットワークは巨大です)。ここにあります:
# make sure g is your network
indegree <- degree(g, mode="in")
V(g)$indegree <- indegree
dev <- V(g)[indegree==0]
m <- similarity.invlogweighted(g, dev)
x.m <- melt(m)
colnames(x.m) <- c("dev1", "dev2", "value")
x.m <- x.m[x.m$value > 0, ]
write.csv(x.m, file = sub(".csv",
"_similarity.csv", filename))