如何使用Python接口的igraph投影二分网络?

-1 投票
1 回答
1598 浏览
提问于 2025-04-18 06:38

我有一份很大的数据,里面有一百万行,这些数据组成了一个二分网络。网络的一边代表应用程序(APP),另一边代表IP地址。

数据的格式是:

1     1.1.1.1  

1     1.2.1.1

2     1.1.1.1

1     1.3.1.1

2     1.2.1.1 

我想用igraph(Python接口)写一些东西,把数据投影到一边。比如说:

1.1.1.1  1.2.1.1 the weight = 2

1.1.2.1  1.3.1.1 the weight = 1

权重表示1.1.1.1这个节点和1.2.1.1节点共享了一个共同的应用程序(1)和另一个共同的应用程序(2)。

我还想把这个权重保存到一个txt格式的文件里。

我有点困惑,不知道怎么用igraph来处理这个问题。

igraph能解决这个问题吗?

谢谢!

1 个回答

3

可以通过类似下面的方式来实现:

from igraph import Graph

def looks_like_ip_address(label):
    return "." in label

g = Graph.Read_Ncol("your-input-file.txt")
g.vs["type"] = [looks_like_ip_address(name) for name in g.vs["name"]]
one, other = g.bipartite_projection()
the_projection_you_need = other

在igraph中,二分图被假设有一个布尔类型的 type 属性。这个属性的意思是,type = False 的节点属于图的一边,而 type = True 的节点属于另一边。因此,我们首先加载你的图,然后用一个简单的规则手动设置这些类型:如果节点的标签里有一个点(.),那么就认为它属于 type = True 的那一边。接着,我们只需生成两个投影,并丢弃其中一个。你可以用下面的表达式从投影中获取权重:

the_projection_you_need.es["weight"]

更新:根据你的图的情况,有可能其中一个投影(你不需要的那个)太大,无法放进内存,而另一个则可以。g.bipartite_projection() 有一个 which 参数,可以让你指定需要哪个投影,所以你可以这样做:

the_projection_you_need = g.bipartite_projection(which=True)

撰写回答