Graph 如何计算图形的熵?
我有一组随机生成的形式图,我想计算每个图的熵。同样的问题用不同的话来说:我有几个网络,我想计算每个网络的信息内容 这里有两个包含图熵的正式定义的来源:Graph 如何计算图形的熵?,graph,social-networking,entropy,information-theory,Graph,Social Networking,Entropy,Information Theory,我有一组随机生成的形式图,我想计算每个图的熵。同样的问题用不同的话来说:我有几个网络,我想计算每个网络的信息内容 这里有两个包含图熵的正式定义的来源: (PDF) 我正在寻找的代码将图形作为输入(作为边列表或邻接矩阵),并输出若干位或其他信息内容度量 因为我在任何地方都找不到它的实现,所以我开始根据正式定义从头开始编写代码。如果有人已经解决了这个问题并愿意分享代码,我们将不胜感激。如果你有一个加权图,一个好的开始就是对所有权重进行排序和计数。然后可以使用公式-log(p)+log(2)(htt
(PDF) 我正在寻找的代码将图形作为输入(作为边列表或邻接矩阵),并输出若干位或其他信息内容度量
因为我在任何地方都找不到它的实现,所以我开始根据正式定义从头开始编写代码。如果有人已经解决了这个问题并愿意分享代码,我们将不胜感激。如果你有一个加权图,一个好的开始就是对所有权重进行排序和计数。然后可以使用公式-log(p)+log(2)(http://en.wikipedia.org/wiki/Binary_entropy_function)确定代码所需的位数。也许这不起作用,因为它是二元熵函数?我最后用了不同的论文来定义图熵:
复杂网络的信息论:进化与体系结构约束
R.V.Sole和S.Valverde(2004)
和
基于拓扑结构的网络熵及其对随机网络的计算
王伯宏、王文星和周天祥 下面是用于计算每个参数的代码。代码假定您有一个无向、无权重的图,并且没有自循环。它将邻接矩阵作为输入,并返回以位为单位的熵量。它是在R中实现的,并利用了
graphEntropy您可以使用(=应用于图形的香农熵)。这是一本很好的参考文献。但是请注意,计算通常是NP难的(因为愚蠢的原因,您需要搜索所有顶点子集)。顺便说一句,一旦我实现了这些函数并计算了实图的熵,我对这些度量感到失望。Wang度量只取决于图的大小和密度,根本不考虑图的结构。它主要是一种密度测量。唯一的度量反映了节点之间剩余度计数的多样性。它更像是一种分类的度量,而不是其他任何东西。我仍然无法量化一个图形有多复杂。
graphEntropy <- function(adj, type="SoleValverde") {
if (type == "SoleValverde") {
return(graphEntropySoleValverde(adj))
}
else {
return(graphEntropyWang(adj))
}
}
graphEntropySoleValverde <- function(adj) {
# Calculate Sole & Valverde, 2004 graph entropy
# Uses Equations 1 and 4
# First we need the denominator of q(k)
# To get it we need the probability of each degree
# First get the number of nodes with each degree
existingDegrees = degree(adj)/2
maxDegree = nrow(adj) - 1
allDegrees = 0:maxDegree
degreeDist = matrix(0, 3, length(allDegrees)+1) # Need an extra zero prob degree for later calculations
degreeDist[1,] = 0:(maxDegree+1)
for(aDegree in allDegrees) {
degreeDist[2,aDegree+1] = sum(existingDegrees == aDegree)
}
# Calculate probability of each degree
for(aDegree in allDegrees) {
degreeDist[3,aDegree+1] = degreeDist[2,aDegree+1]/sum(degreeDist[2,])
}
# Sum of all degrees mult by their probability
sumkPk = 0
for(aDegree in allDegrees) {
sumkPk = sumkPk + degreeDist[2,aDegree+1] * degreeDist[3,aDegree+1]
}
# Equivalent is sum(degreeDist[2,] * degreeDist[3,])
# Now we have all the pieces we need to calculate graph entropy
graphEntropy = 0
for(aDegree in 1:maxDegree) {
q.of.k = ((aDegree + 1)*degreeDist[3,aDegree+2])/sumkPk
# 0 log2(0) is defined as zero
if (q.of.k != 0) {
graphEntropy = graphEntropy + -1 * q.of.k * log2(q.of.k)
}
}
return(graphEntropy)
}
graphEntropyWang <- function(adj) {
# Calculate Wang, 2008 graph entropy
# Uses Equation 14
# bigN is simply the number of nodes
# littleP is the link probability. That is the same as graph density calculated by sna with gden().
bigN = nrow(adj)
littleP = gden(adj)
graphEntropy = 0
if (littleP != 1 && littleP != 0) {
graphEntropy = -1 * .5 * bigN * (bigN - 1) * (littleP * log2(littleP) + (1-littleP) * log2(1-littleP))
}
return(graphEntropy)
}