使用Python的networkx库进行adamic_adar_index链接预测

3
我有一个网络图对象,它是加权和无向的。我试图用Adamic Adar指数预测每个节点的10个新链接。Networkx中的adamic_adar_index函数返回一个元组生成器,格式为(nodeid1,nodeid2,adamic_adar_index)。我不熟悉Python中的生成器。我想做的是按nodeid1分组生成器,并返回nodeid1的最大10个指数。以下是我的代码,其中“coauthor”是网络对象,“preds”是生成器。数据文件在此处https://www.dropbox.com/s/hyr1hgjs4yt03x2/coauthor.csv?dl=0
import csv
import networkx as nx
g = nx.read_weighted_edgelist("coauthor.csv", delimiter='\t', encoding='utf-8')
coauthor = nx.read_weighted_edgelist("coauthor.csv", delimiter='\t', encoding='utf-8')
preds = nx.adamic_adar_index(coauthor)
1个回答

6

请看 heapq.nlargest,它需要一个可迭代对象并返回其中最大的n个元素。由于我没有你的合作者列表,我将使用空手道图。与 adamic_adar_index 的默认行为不同,我将首先遍历 G 中的每个节点 u,并针对所有非邻居的 u 进行此操作。

import networkx as nx
import heapq


def nonedges(G,u):  #a generator with (u,v) for every non neighbor v
    for v in nx.non_neighbors(G, u):
        yield (u, v)


G = nx.karate_club_graph()

for u in G.nodes_iter():# you may want to check that there will be at least 10 choices.
    preds = nx.adamic_adar_index(G,nonedges(G,u))
    tenlargest = heapq.nlargest(10, preds, key = lambda x: x[2])
    print tenlargest

警告:如果不小心处理,您所描述的算法中存在一个错误:对于节点1,您可能会发现一些元组被返回为(1,2,3.2),(1,3,0.3),(4,1,100)。 您描述的分组方式将错过(4,1)对。 我的示例检查每个对两次以避免此问题。 通过努力,可能可以消除计算机工作的重复。

生成器和迭代器密切相关。更多关于迭代器的信息请参见https://docs.python.org/2/glossary.html#term-iterator(您也可以在该页面上找到生成器)。您可以将其视为列表,但是有关如何访问它的规则。每次查看它时,您都会获得下一个元素。查看元素后,它将从迭代器中删除。您只能从迭代器中获取一个东西。在计算机内存中,它不必保留整个内容(当请求下一个元素时,它会生成)。因此,例如,在我的循环中,您可以看到我使用了迭代器而不是G.nodes()。这意味着计算机从未必须在其内存中保存G中的所有节点。

for u in G.nodes_iter():

对比

for u in G.nodes()

非常感谢!这绝对是迭代节点的高效方法。我查阅了迭代器的信息,帮助非常大! - Shengjie Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接