【问题标题】:How do I calculate the entropy of a graph?如何计算图的熵?
【发布时间】:2011-08-05 02:30:27
【问题描述】:

我有一组随机生成的形式图,我想计算每个图的熵。同一个问题,不同的话:我有几个网络,想计算每个网络的信息量。

这里有两个包含图熵正式定义的来源:
http://www.cs.washington.edu/homes/anuprao/pubs/CSE533Autumn2010/lecture4.pdf (PDF) http://arxiv.org/abs/0711.4175v1

我正在寻找的代码将图形作为输入(作为边列表或邻接矩阵)并输出一些位或其他信息内容度量。

因为我在任何地方都找不到它的实现,所以我打算根据正式定义从头开始编写代码。如果有人已经解决了这个问题并愿意分享代码,将不胜感激。

【问题讨论】:

    标签: graph social-networking entropy information-theory


    【解决方案1】:

    我最终使用了不同的论文来定义图熵:
    复杂网络的信息理论:关于进化和架构约束
    房车Sole 和 S. Valverde (2004)

    基于拓扑配置的网络熵及其对随机网络的计算
    B.H.王W.X.王和周周

    计算每个的代码如下。该代码假定您有一个无自环的无向、未加权图。它将邻接矩阵作为输入,并以位为单位返回熵的数量。它在 R 中实现并使用 sna package

    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)
    }
    

    【讨论】:

    • 顺便说一下,一旦我实现了这些函数并计算了真实图的熵,我对这些措施感到失望。 Wang 度量只取决于图的大小和密度,根本不考虑图的结构。它主要是密度的度量。 Sole 度量反映了节点间剩余度数的多样性。它比其他任何东西都更能衡量分类性。我仍然无法量化图表的复杂程度。
    【解决方案2】:

    如果您有一个加权图,一个好的开始是对所有权重进行排序和计数。然后您可以使用公式 -log(p)+log(2) (http://en.wikipedia.org/wiki/Binary_entropy_function) 来确定代码所需的位数。也许这不起作用,因为它是二元熵函数?

    【讨论】:

      【解决方案3】:

      您可以使用Koerner's entropy(= 香农熵应用于图形)。一个很好的参考文献是here。但是请注意,计算通常是 NP-hard(出于愚蠢的原因,您需要搜索所有顶点子集)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 2010-11-02
        • 2015-01-31
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多