我正在尝试计算具有两种类型节点的网络的 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
is1
和m
is 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))