繁体   English   中英

带有adamic_adar_index的Python networkx链接预测

[英]Python networkx link prediction with adamic_adar_index

我有一个networkx图形对象,它是加权的和无向的。 我试图使用Adamic Adar Index为每个节点预测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)

看一看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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM