【发布时间】:2015-04-27 02:33:41
【问题描述】:
我正在从事图形分析。我想计算一个 N × N 相似度矩阵,其中包含每两个顶点之间的 Adamic Adar 相似度。为了概述 Adamic Adar,让我从以下介绍开始:
给定无向图G 的邻接矩阵A。 CN 是两个顶点x、y 的所有公共邻居的集合。两个顶点的公共邻居是两个顶点都有一条边/链接,即两个顶点对于A 中的相应公共邻居节点都有一个 1。 k_n 是节点n 的度数。
Adam-Adar 定义如下:
我的计算尝试是从A 获取x 和y 节点的两行,然后对它们求和。然后查找具有2 作为值的元素,然后获取它们的度数并应用等式。然而,计算确实需要很长时间。我尝试了一个包含 1032 个顶点的图,计算需要很长时间。它从 7 分钟开始,然后我取消了计算。所以我的问题是:有没有更好的算法来计算它?
这是我在 python 中的代码:
def aa(graph):
"""
Calculates the Adamic-Adar index.
"""
N = graph.num_vertices()
A = gts.adjacency(graph)
S = np.zeros((N,N))
degrees = get_degrees_dic(graph)
for i in xrange(N):
A_i = A[i]
for j in xrange(N):
if j != i:
A_j = A[j]
intersection = A_i + A_j
common_ns_degs = list()
for index in xrange(N):
if intersection[index] == 2:
cn_deg = degrees[index]
common_ns_degs.append(1.0/np.log10(cn_deg))
S[i,j] = np.sum(common_ns_degs)
return S
【问题讨论】:
-
您可以通过不构建 common_ns_degs 来节省一些计算,而是将 -log10(cn_deg) 添加到您现在调用 list() 的位置初始化为零的 S[i,j]。顺便说一句,它应该是 log10(1.0/cn_deg),而不是 1.0/log10(cn_deg)。
-
Adamic-Adar 指数的公式与提供的公式略有不同。它是公共邻居 k_n 的 sum(1/log(k_n))。代码似乎是正确的
标签: python algorithm math numpy graph