2011-08-05 16 views
9

Mam zestaw losowo generowanych wykresów formalnych i chciałbym obliczyć entropię każdego z nich. To samo pytanie w różnych słowach: mam kilka sieci i chcę obliczyć zawartość informacji każdego z nich.Jak obliczyć entropię wykresu?

Oto dwa źródła zawierające formalne definicje wykres entropii:
http://www.cs.washington.edu/homes/anuprao/pubs/CSE533Autumn2010/lecture4.pdf (PDF) http://arxiv.org/abs/0711.4175v1

Kod szukam trwa wykres jako wejście (albo jako listy krawędzi lub macierz sąsiedztwa) oraz wyprowadza pewną liczbę bitów lub jakąś inną miarę zawartości informacyjnej.

Ponieważ nie mogę znaleźć nigdzie tego rozwiązania, zamierzam zakodować to od podstaw na podstawie formalnych definicji. Jeśli ktoś już rozwiązał ten problem i jest skłonny do udostępnienia kodu, byłoby to szalenie cenione.

Odpowiedz

5

skończyło się stosując różne papiery definicje wykres entropii:
teoria informacji o złożonych sieciach: o ewolucji i ograniczenia architektoniczne
R.V. Sole i S. Valverde (2004)
i
Network Entropia Na podstawie konfiguracji topologii i jej obliczeń losowych Networks
B.H. Wang, W.X. Wang i T. Zhou

Kod do obliczenia każdego znajduje się poniżej. Kod zakłada, że ​​masz nieukierunkowany, nieważony wykres bez pętli własnych. Przyjmuje matrycę dopasowania jako dane wejściowe i zwraca liczbę entropii w bitach. Jest zaimplementowany w R i korzysta z 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) 
} 
+4

Nawiasem mówiąc, po wprowadzeniu tych funkcji i obliczeniu entropii dla rzeczywistych wykresów, byłem rozczarowany tymi środkami. Miara Wanga zależy tylko od wielkości wykresu i gęstości i wcale nie bierze pod uwagę struktury wykresu. Jest to w większości miara gęstości. Miara Sole odzwierciedla różnorodność pozostałych stopni stopni między węzłami. Jest to bardziej miara asortymentu niż cokolwiek innego. Nadal nie jestem w stanie oszacować, jak skomplikowany jest wykres. –

1

Jeśli masz ważony wykres dobrym początkiem byłoby sortowanie i zliczanie wszystkich wag. Następnie możesz użyć formuły -log (p) + log (2) (http://en.wikipedia.org/wiki/Binary_entropy_function), aby określić ilość bitów potrzebnych dla kodu. Może to nie działa, ponieważ jest to funkcja entropii binarnej?

0

Można użyć Koerner's entropy (= Zastosowano entropię Shannon zastosowaną do wykresu). Dobrym odniesieniem dla literatury jest here. Zauważ jednak, że obliczenia są generalnie NP-trudne (z głupiego powodu, że musisz przeszukać wszystkie podzbiory wierzchołków).