如何使用Python接口的igraph投影二分网络?
我有一份很大的数据,里面有一百万行,这些数据组成了一个二分网络。网络的一边代表应用程序(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)