1

我正在尝试计算具有两种类型节点的网络的 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=',')

这段代码有问题,因为devis1mis 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))
4

1 回答 1

1

您将入度分配为图形属性,而不是顶点属性,因此您以后不能合理g.vs.select()地调用。你需要这个:

indegree = g.degree(mode="in")
g.vs["indegree"] = indegree
dev = g.vs.select(indegree=0)

但实际上,你可以简单地这样写:

dev = g.vs.select(_indegree=0)

这是因为该select方法的工作原理:

如果从关键字参数推断出的属性名称以下划线 ( ) 开头,则它们将被特殊处理_。这些不是真正的属性,而是指顶点的特定属性,例如,它的度数。规则如下:如果属性名称以下划线开头,则名称的其余部分被解释为 Graph 对象的方法。此方法以顶点序列作为其第一个参数(所有其他参数保留默认值)调用,并根据该方法返回的值过滤顶点。

于 2015-08-30T12:29:58.737 回答