Как рассчитать энтропию графа? - PullRequest
10 голосов
/ 05 августа 2011

У меня есть набор случайно сгенерированных формальных графов, и я хотел бы рассчитать энтропию каждого из них.Один и тот же вопрос разными словами: у меня есть несколько сетей, и я хочу рассчитать информационное содержание каждой из них.

Вот два источника, содержащие формальные определения энтропии графа:
http://www.cs.washington.edu/homes/anuprao/pubs/CSE533Autumn2010/lecture4.pdf (PDF) http://arxiv.org/abs/0711.4175v1

Код, который я ищу, принимает в качестве входных данных граф (в виде списка ребер или матрицы смежности) и выводит количество бит или некоторую другую меру информационного содержания.

Поскольку я нигде не могу найти реализацию этого, я собираюсь кодировать это с нуля на основе формальных определений.Если кто-нибудь уже решил эту проблему и готов поделиться кодом, это было бы очень полезно.

Ответы [ 3 ]

5 голосов
/ 10 августа 2011

Я использовал разные статьи для определения энтропии графа:
Теория информации сложных сетей: об эволюции и архитектурных ограничениях
R.V. Соле и С. Вальверде (2004)
и
Энтропия сети на основе конфигурации топологии и ее вычисления в случайных сетях
B.H. Wang, W.X. Ван и Т. Чжоу

Код для расчета каждого приведен ниже. Код предполагает, что у вас есть неориентированный, невзвешенный граф без самоциклов. Он принимает матрицу смежности в качестве входных данных и возвращает количество энтропии в битах. Он реализован на R и использует пакет sna .

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)
}
1 голос
/ 05 августа 2011

Если у вас есть взвешенный график, хорошим началом будет сортировка и подсчет всех весов.Затем вы можете использовать формулу -log (p) + log (2) (http://en.wikipedia.org/wiki/Binary_entropy_function), чтобы определить количество битов, необходимых для кода. Возможно, это не сработает, потому что это двоичная функция энтропии?

0 голосов
/ 17 марта 2017

Вы можете использовать Энтропия Кернера (= Энтропия Шеннона, примененная к графику). Хороший справочник по литературе: здесь . Тем не менее, обратите внимание, что вычисления в общем NP-сложны (по глупой причине, что вам нужно искать все подмножества вершин).

...