Algorithmische Methoden zur Netzwerkanalyse Prof. Dr. Henning Meyerhenke Skript zur Vorlesung Version v0.5.3 20. Juli 2017 Vorwort Dieses Skript basiert im Wesentlichen auf der Vorlesung Algorithmische Methoden zur Netzwerkanalyse, die ich mehrfach am Karlsruher Institut für Technologie (KIT) als V2Ü1 gehalten habe, zuletzt im Sommersemester 2017. Perspektivisch werden Vorlesung und Skript in Richtung V4Ü2 ausgeweitet werden, weshalb teilweise schon mehr Material angedeutet wird, als bisher innerhalb eines einzelnen Semesters gelesen wurde. Danken möchte ich im Rahmen der Entstehung des Skriptes zunächst Demian Hespe, dessen Vorlesungsmitschrift in manchen Teilen als Grundlage gedient hat. Außerdem danke ich meinen wissenschaftlichen Mitarbeitern, die mit ihren Forschungsergebnissen bzw. ihrem Einsatz in der Lehre diese Vorlesung und die zugehörigen Übungen in Teilen mitgestaltet haben: Elisabetta Bergamini, Moritz von Looz und Christian Staudt. Weiterer Dank gilt natürlich auch allen, die zum Entstehen unserer Open-Source-Software NetworKit beigetragen haben. Ohne eure vielen Beiträge wäre NetworKit heute nicht das, was es ist! Im Laufe der Zeit wird das Skript weiter wachsen. Trotzdem erhebt das Skript auch zum Semesterende keinen Anspruch auf Vollständigkeit, jedenfalls nicht in den Versionsnummern mit führender Null. Es ergänzt lediglich in einigen Teilen die Folien zur Vorlesung – mal mehr, mal weniger. Momentan fehlen noch viele Erklärungen (sowie Abbildungen und Beispiele), die gerade das Skript als Erweiterung zu den Folien liefern soll. Beide zusammen, Folien und Skript, sind jedoch nicht als Ersatz zum Besuch der Vorlesung gedacht, sondern als Hilfestellung bei der notwendigen Vor- und Nachbereitung. Sollten Sie auf Fehler stoßen, bitte ich um einen entsprechenden Hinweis. Karlsruhe, im Sommer 2017 2 Henning Meyerhenke Versionen v0.1.0 (März 2017): Wenige Fragmente zur Ergänzung v0.2.0 (26. April 2017): Neue Struktur, erste Details in Kapitel 2 v0.3.0 (17. Mai 2017): Korrekturen, erweitert um Kapitel 2.1.7 und Teile von Kapitel 3 v0.4.0 (7. Juni 2017): Erste Teile von Kapitel 4 v0.4.1 (13. Juni 2017): Korrekturen, ER-Graphen, neue Kapitel im Anhang vorgesehen v0.4.2 (22. Juni 2017): Weitere Teile von Kapitel 4 v0.4.3 (29. Juni 2017): Korrekturen und Ergänzungen zu vorhandenen Teilen in Kapitel 5 v0.5.0 (5. Juli 2017): Korrekturen, Ergänzungen in Kapitel 5 v0.5.1 (11. Juli 2017): Korrekturen, Ergänzungen in Kapiteln 5 und 6 v0.5.2 (17. Juli 2017): Korrekturen, Ergänzungen in Kapitel 6 v0.5.3 (20. Juli 2017): Korrekturen, Ergänzungen in Kapitel 6 Achtung: weitere Überarbeitungen der existierenden Teile werden folgen (müssen) 3 Inhaltsverzeichnis 1. Einleitung 1.1. Motivation . . . . . . . . . . . . . . 1.2. Notation und Wiederholung . . . . . 1.2.1. Netzwerke und Graphen . . . 1.2.2. Repräsentation von Graphen 1.2.3. Grundlegende Eigenschaften . 1.3. NetworKit . . . . . . . . . . . . . . . 1.3.1. Grundlegende Funktionen . . 1.4. Weiterführende Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Zentralitätsmaße 2.1. Knotenzentralitätsmaße . . . . . . . . . . . . . . . . . . 2.1.1. Grad-Zentralität . . . . . . . . . . . . . . . . . . 2.1.2. Kernzahl und k-Kern-Zerlegung . . . . . . . . . . 2.1.2.1. Motivation und Definition . . . . . . . . 2.1.2.2. Theoretische Resultate* . . . . . . . . . 2.1.2.3. Sequentieller Linearzeit-Algorithmus . . 2.1.2.4. Paralleler Algorithmus . . . . . . . . . . 2.1.3. Clusterkoeffizienten und Transitivität . . . . . . 2.1.3.1. Motivation und Definition . . . . . . . . 2.1.3.2. Exakte Berechnung . . . . . . . . . . . 2.1.3.3. Approximation . . . . . . . . . . . . . . 2.1.4. Eigenvektor-Zentralität . . . . . . . . . . . . . . 2.1.4.1. Besonderheiten bei gerichteten Graphen 2.1.4.2. Berechnung . . . . . . . . . . . . . . . . 2.1.5. PageRank . . . . . . . . . . . . . . . . . . . . . . 2.1.5.1. Kontext . . . . . . . . . . . . . . . . . . 2.1.5.2. Etwas Mathematik hinter PageRank . . 2.1.6. Betweenness Centrality . . . . . . . . . . . . . . 2.1.6.1. Effiziente Berechnung der BC-Werte . . 2.1.6.2. Approximation der BC-Werte . . . . . 2.1.7. Nähe- und harmonische Zentralität . . . . . . . . 2.2. Top-k-Ranglisten* . . . . . . . . . . . . . . . . . . . . . 2.3. Kantenzentralitätsmaße* . . . . . . . . . . . . . . . . . . 2.4. Weiterführende Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 9 9 10 10 11 11 . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 15 15 16 17 18 18 18 20 21 23 24 25 27 27 27 30 31 34 34 36 37 37 5 Inhaltsverzeichnis 3. Kürzeste Wege und globaler Zusammenhang 3.1. Paarweise Abstände und kürzeste Wege . . . . . . . . 3.1.1. Floyd-Warshall-Algorithmus . . . . . . . . . . . 3.1.2. Matrix-Multiplikation . . . . . . . . . . . . . . 3.2. Zweistufige Berechnung kürzester Wege . . . . . . . . 3.2.1. Naiver Ansatz . . . . . . . . . . . . . . . . . . 3.2.2. Markieren mit Beschränkung der Suche . . . . 3.3. Das Phänomen der kleinen Welt und der Durchmesser 3.4. Zusammenhangskomponenten . . . . . . . . . . . . . . 3.5. Weiterführende Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 39 39 40 41 42 43 46 50 52 4. Generierung von Graphen 4.1. Exakte Generierung von Gradfolgen . . . . . . . . . . . . . . . 4.2. Erdős-Rényi-Modell . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1. Grundlegende Eigenschaften von G(n, p)-Graphen . . . 4.2.2. Phasenübergang bzgl. der Zusammenhangskomponenten 4.2.3. Effiziente Generierung von Erdős-Rényi-Graphen . . . . 4.3. Barabási-Albert-Modell . . . . . . . . . . . . . . . . . . . . . . 4.4. Chung-Lu-Modell . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5. Rekursives Matrix-Modell (R-MAT) . . . . . . . . . . . . . . . 4.6. Zufallsgraphen mit hyperbolischer Geometrie (RHG) . . . . . . 4.7. LFR und ReCon . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8. Weiterführende Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 53 56 57 58 61 61 61 61 61 62 62 5. Clusteranalyse 5.1. Zielfunktion Modularität . . . . . . . . . . . . . . 5.2. Spektrale Optimierung von Modularität . . . . . 5.3. Die Louvain-Methode . . . . . . . . . . . . . . . 5.4. Verbesserung von Clusterungen mit Gütegarantie 5.4.1. Algorithmus . . . . . . . . . . . . . . . . . 5.4.2. Analyse des Algorithmus . . . . . . . . . 5.4.3. Zusammenfassung . . . . . . . . . . . . . 5.5. Weiterführende Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 64 68 68 68 69 71 73 73 6. Ausbreitung von Krankheiten in Netzwerken 6.1. Verzweigungsprozess . . . . . . . . . . . . . . . . . . . . . . . 6.2. SI*-Modelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3. Cyberabwehr als Optimierungsproblem . . . . . . . . . . . . . 6.3.1. Einführung . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2. Optimierungsmodell . . . . . . . . . . . . . . . . . . . 6.3.3. Heuristische Lösung durch ein Mehrebenen-Verfahren 6.3.4. Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 75 76 76 76 78 79 82 Literaturverzeichnis 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Inhaltsverzeichnis A. Grundlagen der linearen Algebra A.1. Matrizen, Vektoren und ihre Operationen A.2. Eigenwerte und -vektoren . . . . . . . . . A.3. NetworKit-Quellcodes . . . . . . . . . . . . A.4. Lösungen zu den Übungsaufgaben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 87 87 88 88 7 1. Einleitung 1.1. Motivation 1.2. Notation und Wiederholung 1.2.1. Netzwerke und Graphen Definition 1.1 (Weglänge bzw. -gewicht). Sei ein gerichteter und gewichteter Graph G = (V, E, ω) mit der Gewichtsfunktion ω : E 7→ R gegeben. Das Gewicht P eines Weges p = hv0 , v1 , . . . , vk i ist die Summe der Gewichte seiner Kanten: w(p) := ki=1 ω(vi−1 , vi ). Im ungewichteten Fall muss man nur alle Kantengewichte als 1 ansehen und man erhält, dass die Länge des Weges die Zahl seiner Kanten ist. Definition 1.2 (Kürzester Weg). Sei G = (V, E, ω) wie in Definition 1.1. Ein kürzester Weg von u nach v ist ein Weg minimalen Gewichts unter allen Wegen von u nach v. Sein Gewicht ist die Distanz von u nach v. Existiert kein Weg von u nach v, so definiert man die Distanz als unendlich. Auf Basis von Wegen lässt sich der Zusammenhang in Graphen definieren: Definition 1.3 (Zusammenhang). Ein gerichteter Graph G = (V, E) heißt stark zusammenhängend, falls er für jedes Paar (u, v) ∈ V × V sowohl einen (u, v)-Pfad als auch einen (v, u)-Pfad enthält. G heißt schwach zusammenhängend, wenn der symmetrische Graph (d. h. der Graph, der entsteht, wenn jede Kante von G doppelt gerichtet wird) zu G stark zusammenhängend ist. Im ungerichteten Fall spricht man nur von zusammenhängend, da dort starker und schwacher Zusammenhang zusammenfallen. Definition 1.4 (Zusammenhangskomponente). Ein maximaler [stark, schwach] zusammenhängender Teilgraph eines Graphen G heißt [starke, schwache] Zusammenhangskomponente. 1.2.2. Repräsentation von Graphen Die gängigste graphische Darstellung eines Graphen ist sein Knoten-Kanten-Diagramm. Zur Repräsentation im Rechner bieten sich platzeffiziente Datenstrukturen an, da wir mitunter mit sehr großen Graphen arbeiten. Zudem ist es manchmal vorteilhaft, den Graphen algebraisch über seine Adjazenzmatrix (oder eine andere Matrix) zu definieren: 9 1. Einleitung Definition 1.5 (Adjazenzmatrix). Die Adjazenzmatrix eines schlichten Graphen G = (V, E, ω) mit n Knoten ist eine n × n-Matrix mit folgenden Einträgen: ( ω(u, v) , falls (u, v) ∈ E Auv = 0 , sonst Der Eintrag an der Position (u, v) ist also das Gewicht der Kante von u nach v (bzw. Gewicht 1 bei ungewichteten Graphen). Beachten Sie, dass das Lehrbuch von Newman [New10a] entgegen der vorherrschenden Konvention in der Algorithmik die Richtung der Kanten genau andersherum definiert! Das kann man natürlich auch machen, man muss sich als Leser nur über die Bedeutung im Klaren sein. In der Praxis ist die Adjazenzmatrix wie oben beschrieben wegen ihres hohen Speicherverbrauchs ungebräuchlich. Allerdings gibt es Matrix-Datenstrukturen, die Nullen nicht speichern und ähnlich zu Adjazenzarrays (Speicherverbrauch O(n+m) sind. Die MatrixSchreibweise erlaubt uns zusätzliche Analyse-Möglichkeiten, indem wir Ergebnisse der numerischen linearen Algebra verwenden. Der Mathematik ist es dabei (weitgehend) egal, ob die Matrix als dünne oder dichte Matrix im Rechner gespeichert wird. 1.2.3. Grundlegende Eigenschaften In diesem Kapitel geben wir einige grundlegende Eigenschaften von Graphen wider, die Sie vermutlich bereits aus Grundlagenveranstaltungen kennen. Lemma 1.6 (handshake lemma). In (gerichteten wie ungerichteten) Multigraphen mit m Kanten gilt: X deg(v) = 2m v∈V Beweis. Selbstübung. Das handshake lemma ist häufig nützlich bei der Laufzeitanalyse. Iteriert ein Algorithmus über alle Knoten und dabei über die Nachbarn des aktuellen Knotens, dann wissen wir, dass am Ende alle Kanten genau zweimal angeschaut wurden und der Aufwand daher O(n + m) ist. Die oben beschriebene Adjazenzmatrix kann u. a. dazu verwendet werden, auf (methodisch) einfache Art und Weise die Anzahl der Wege einer bestimmten Länge zu zählen: Lemma 1.7. Sei A die Adjazenzmatrix des Graphen G = (V, E). Dann gilt: Ati,j ist die Anzahl der Pfade der Länge t von i nach j in G. Beweis. Selbstübung. 1.3. NetworKit NetworKit [SSM16] ist ein Software-Werkzeug zur Analyse großer Netzwerke. Seine Entwicklung geschieht quelloffen auf github, dabei spielt meine Arbeitsgruppe als Initiator 10 1.4. Weiterführende Literatur des Projekts eine tragende Rolle. NetworKit verbindet das Beste aus zwei Welten: Das Frontend für und in Python erlaubt interaktive explorative Analyse. Die performancerelevanten Teile sind allerdings in C++ geschrieben und häufig auch mit OpenMP für Shared-Memory-Systeme parallelisiert. Dazwischen vermittelt Cython, ein Compiler von Python nach C/C++. Auf diese Weise erhalten wir den Komfort einer interpretierten Sprache mit der Geschwindigkeit von nativ kompiliertem Code. Zugleich können wir über das Python-Frontend ganz leicht weitere Python-Module einbinden, beispielsweise zur Visualisierung oder statistischen Analyse von Daten. Im Rahmen der Vorlesung werden wir NetworKit immer wieder einsetzen, insbesondere für die praktischen Übungen. Viele der vorgestellten Algorithmen sind auch in NetworKit implementiert. Nutzen Sie das! Es hilft oft dem Verständnis von Pseudocode, wenn man die echte Implementierung hinzuzieht. Der Haupteinstiegspunkt in NetworKit ist die Projektwebseite network-analysis.info. Dort finden Sie Links zu den wesentlichen weiteren Aspekten: wie Sie starten (githubLink, Installation, einfache Beispiele), Dokumentation und Features. 1.3.1. Grundlegende Funktionen 1.4. Weiterführende Literatur Wesentliche Definitionen zu Maßen der Netzwerkanalyse sind im Lehrbuch von Newman [New10a] zu finden. 11 2. Zentralitätsmaße 2.1. Knotenzentralitätsmaße Eine sehr grundlegende Fragestellung der Netzwerkanalyse ist, welche Knoten eines Netzwerks allein aufgrund ihrer Vernetzung wichtig sind. Üblicherweise betrachtet man die Knoten in einer Rangliste, absteigend nach Wichtigkeit sortiert. Dieses Vorgehen formalisiert man durch den Begriff Zentralität: Definition 2.1. Ein Knotenzentralitätsmaß für ein Netzwerk G = (V, E) ist eine Funktion c : V → R, die jedem Knoten v ∈ V einen reellen Wert (allgemeiner kann man hier auch von einem Attributwert auf einer geeigneten Skala sprechen, die eine Rangordnung ermöglicht) zuweist. Der zugewiesene Wert hängt von der Position des Knotens v in G ab, die sich aus einer Teilmenge der Kanten E 0 ⊆ E ergibt. Die Betrachtung über Positionen ließe sich weiter formalisieren (siehe Brandes [Bra16]) – wir werden das hier aus Gründen der Einfachheit aber nicht tun. Es gibt mehr als hundert Zentralitätsmaße; wir können daher natürlich auch nicht alle betrachten. Daher konzentrieren wir uns auf die gängigsten und wie man diese effizient berechnet. Es hängt von der konkreten Anwendung ab, welches Zentralitätsmaß man verwenden sollte. Auch hierzu gibt es wichtige wissenschaftliche Arbeiten, auf die wir aber nur verweisen. Der Zentralitätswert eines Knotens ist zunächst eine Aussage über den einzelnen Knoten. Die daraus resultierende Rangfolge ermöglicht eventuell bereits eine gewisse Aussage über den Graphen. Aussagekräftiger ist aber in der Regel die Verteilung der Zentralitätswerte, also welche Werte (oder Intervalle von Werten) wie häufig (absolut oder relativ) innerhalb einer Grundgesamtheit angenommen werden. 2.1.1. Grad-Zentralität Das vermutlich einfachste Zentralitätsmaß ist die Grad-Zentralität: Definition 2.2. Die Grad-Zentralität weist jedem Knoten v ∈ V die Zahl seiner inzidenten Nachbarn zu: DC : V → N, v 7→ deg(v). DC spiegelt in einem sozialen Netzwerk wider, wie viele Personen man kennt. Das kann unter Umständen ein vernünftiges Maß sein. Hat jemand nur sehr wenige Kontakte, ist es eher unwahrscheinlich, dass er oder sie besonders zentral im Netzwerk ist. Andererseits können wenige sehr wichtige Kontakte unter Umständen wertvoller sein 13 2. Zentralitätsmaße Abbildung 2.1.: Knotengradverteilung des Graphen PGPgiantcompo. als viele unwichtige. Es ist also wünschenswert, zur Bewertung eines Knotens auch die Wichtigkeit seiner Nachbarn zu berücksichtigen. Somit ist die Grad-Zentralität ist nur sehr beschränkt aussagekräftig. Wir werden uns daher in den kommenden Abschnitten mit besseren Maßen befassen. Die Gradverteilung der Knoten ist wiederum eine sehr interessante Eigenschaft eines Netzwerks. Definition 2.3. Die Gradverteilung eines Graphen G = (V, E) ist eine Funktion dd : {0, . . . , n − 1} → {0, . . . , n}, d 7→ |{v ∈ V : deg(v) = d}| Die Gradverteilung misst demnach die absolute (alternativ: relative) Häufigkeit jedes möglichen Gradwertes. Wir stellen nun in unserem Kontext den Knotengrad und seine absolute Häufigkeit als x-y-Diagramm gegenüber: Beachten Sie dabei, dass beide Achsen logarithmisch skaliert sind. Durch die logarithmische Skalierung ergibt sich in unserem dargestellten Beispiel zumindest streckenweise eine Gerade. Diese fällt erst gegen Ende ab. Die Gradverteilung kann bereits erste wichtige Erkenntnisse über ein Netzwerk liefern. Während Gitternetze und andere auf regelmäßigen Formen basierende eingebettete Graphen meist eine sehr gleichförmige Gradverteilung haben, gilt dies für komplexe Netzwerke nicht. Letztere haben eine endlastige Verteilung (heavy-tail distribution), die häufig einem Potenzgesetz (power law ) folgt. Eng verwandt zur Gradverteilung ist die Gradfolge eines Graphen: Definition 2.4 (Gradfolge). Gegeben sei ein gerichteter oder ungerichteter Multigraph G = (V, E) mit Knotenmenge V = {v1 , . . . , vn }. Die Folge D(G) = (deg− (v1 ), deg+ (v1 ), . . . , deg− (vn ), deg+ (vn )) 14 2.1. Knotenzentralitätsmaße des gerichteten bzw. D(G) = (deg(v1 ), . . . , deg(vn )) des ungerichteten Multigraphen G heißt dessen Gradfolge. 2.1.2. Kernzahl und k-Kern-Zerlegung 2.1.2.1. Motivation und Definition Wir haben oben festgestellt, dass die Gradzentralität nur wenig Aussagekraft hat, weil sie die Wichtigkeit der Nachbarn nicht berücksichtigt. In dieser Hinsicht ist die Kernzahl, die aus der k-Kern-Zerlegung resultiert, ein besseres Maß. Gleichzeitig liefert die k-KernZerlegung, die wir erst mal defnieren müssen, einen Einblick in die globale Struktur des Graphen. Definition 2.5. Eine geschachtelte Zerlegung eines schlichten ungerichteten Graphen G = (V, E) ist eine endliche Folge (V0 , . . . , Vk ) von Teilmengen der Knoten mit folgenden Eigenschaften: • V0 = V • Vi+1 ⊂ Vi für 0 ≤ i < k • Vk 6= ∅ Die folgende Definition des k-Kerns ist konstruktiv; sie gibt bereits einen Algorithmus an, wie man die gewünschte Zerlegung prinzipiell berechnen kann. Definition 2.6. Der i-Kern von G ist der eindeutige Teilgraph, den man erhält, indem man nacheinander alle Knoten mit Grad kleiner als i entfernt. Alternativ lässt sich der i-Kern so definieren: Definition 2.7. Der i-Kern ist die Menge aller Knoten mit mindestens i Nachbarn, die auch zum i-Kern gehören. Definition 2.8. Der Kern, Core(G), von G ist der nichtleere k-Kern mit maximalem k. Nun können wir endlich die Kernzahl eines Knotens definieren. Definition 2.9. Ein Knoten v hat die Kernzahl (coreness) i, wenn v zum i-Kern gehört, aber nicht zum (i + 1)-Kern. Ein Beispiel einer k-Kern-Zerlegung ist in Abbildung 2.2 dargestellt. Die Kernzahl ist dabei in den Knoten als Zahl vermerkt. Definition 2.10. Die i-Schale von G besteht aus allen Knoten mit Kernzahl i. Definition 2.11. Das Zentralitätsmaß CoreC ordnet jedem Knoten seine Kernzahl zu. 15 2. Zentralitätsmaße Abbildung 2.2.: Beispiel einer k-Kern-Zerlegung [BGG+ 08] 2.1.2.2. Theoretische Resultate* Lemma 2.12. Sei G = (V, E) ein Graph, (V0 , . . . , Vk ) seine Kern-Zerlegung und Gi := (Vi , Ei ) := G[Vi ] sein i-Kern. Seien weiterhin ni := |Vi \Vi+1 | die Zahl der Knoten in der i-Schale und mi := |Ei \Ei+1 | die Zahl der Kanten, deren Endknoten mit minimaler Kernzahl zur i-Schale gehören. Per Definition gelte: Vk+1 := ∅, Ek+1 := ∅. Dann lässt sich die Größe der i-Schale beschränken durch: ( i d i·n 2 e ni 2 + ni (i − ni + 1) 0 ≤ ni , if ni > i , if ni ≤ i ≤ mi ≤ |V | ( i · ni ≤ i · ni − (2.1) i(i+1) 2 , if i < k , if i = k (2.2) Beweis. Ungleichung (2.1) ist trivial. Wir beweisen nun von (2.2) die erste Zeile. Seien dazu V 0 := Vi \Vi+1 und deg(i) (v) := degGi (v) der Knotengrad von v in Gi . (i) 1. Nach Konstruktion der Zerlegung v ∈ V 0 gelten. WeiP Pmuss deg (v)P≥ i für alle (i) terhin muss 2|Ei \Ei+1 | ≥ v∈V 0 u∈N (i) (v) 1 = v∈V 0 deg (v) gelten. Denn nur die Kanten mit beiden Endknoten in Vi werden nicht nur auf der linken Seite der Ungleichung, sondern P P auch rechtsi davon doppelt gezählt. Daraus folgt: mi ≥ 12 v∈V 0 deg(i) (v) ≥ 12 v∈V 0 i = i·n 2 . 2. Falls alle Kanten extern sind (also zwischen verschiedenen Schalen verlaufen), dann sind dies i · ni Stück. Mehr als i externe Kanten kann ein Knoten der i-Schale nicht haben, da er sonst einer höheren Schale angehören würde. 16 2.1. Knotenzentralitätsmaße 2.1.2.3. Sequentieller Linearzeit-Algorithmus Der generische Algorithmus 2.1 zur Berechnung der k-Kern-Zerlegung folgt der konstruktiven Definition 2.6. Nacheinander werden die Knoten einer Schale (startend bei der 0-Schale) entfernt, bis keiner mehr aus dieser Schale übrig bleibt. Dann wird zur nächsten Schale übergegangen. Die wesentliche Einsicht dabei ist, dass die Knoten zur i-Schale gehören, deren Residualgrad resdegree kleiner als i ist. Algorithm 2.1 Generischer Code für die Berechnung der k-Kern-Zerlegung 1: function CoreDecomposition(G = (V, E)) 2: Ausgabe: Kernzahl k des Kerns von G und Feld core mit Kernzahl jedes Knotens 3: Speichere die Knotengrade für alle Knoten in resdegree 4: i←0 5: while V 6= ∅ do 6: i←i+1 7: for each v ∈ V mit resdegree[v] < i do 8: core[v] ← i − 1 9: for each u ∈ N (v) do 10: resdegree[u] ← resdegree[u] − 1 11: end for 12: Entferne v aus G 13: end for 14: end while 15: return (i − 1, core) 16: end function Pseudocode ist wie bekannt bewusst abstrakt gehalten. Das kann dafür sorgen, dass die Zeitkomplexität eines Algorithmus auf den ersten Blick höher als nötig erscheint. Auch hier sollte die Implementierung des Algorithmus mit der üblichen Sorgfalt erfolgen, damit man einen effizienten Algorithmus erhält. In der Tat lässt sich die k-Kern-Zerlegung nämlich in linearer Zeit (bezogen auf die Zahl der Kanten) umsetzen. Die wesentliche Einsicht, die dazu benötigt wird, ist eine effiziente Suche der Knoten, deren Residualgrad kleiner als i ist. Dazu nutzt man eine adressierbare Prioritätswarteschlange für ganzzahlige Werte. Dann lässt sich Zeile 7 des Algorithmus in amortisierter konstanter Zeit durchführen, wie das folgende Lemma beweist. Lemma 2.13. Sei G = (V, E) mit |E| =: m zusammenhängend, ungewichtet und schlicht. Dann kann der Algorithmus CoreDecomposition(G) in der Laufzeit O(m) implementiert werden. Beweis. Das Berechnen und Speichern der Knotengrade in Zeile 3 ist offensichtlich in O(m) Zeit möglich. Damit die Schleife in Linearzeit läuft, brauchen wir eine geeignete Datenstruktur. Es handelt sich dabei um eine adressierbare Prioritätswarteschlange mit Behältern (bucket priority queue). Sie besteht zunächst aus einem Feld A der Länge n, wobei A[i] ein 17 2. Zentralitätsmaße Zeiger auf die doppelt verkettete Liste Li ist, die alle Knoten v mit resdegree[v] = i speichert (0 ≤ i < n). Außerdem gibt es eine Variable dmin , die das minimale i mit nichtleerer Liste Li speichert, und ein Feld vptr, dessen Einträge vptr[v] auf den Eintrag von Knoten v in der passenden Liste Li verweist. Vor dem Eintritt in die while-Schleife kann diese Datenstruktur in O(n) Zeit konstruiert werden. Weil G zusammenhängend ist, gilt m ≥ n − 1. Somit ist max{n, m} = O(m). Der Pseudocode wird so erweitert, dass direkt nach Zeile 9 ein Knoten u in die Liste Lresdegree[u] verschoben wird. Dies geht in konstanter Zeit. Ggf. muss zwar dmin auch verändert werden, aber dies geht nach Ergebnissen von Fiduccia und Mattheyses in amortisiert konstanter Zeit. Das Hauptargument hier ist, dass ein Ansteigen des Zeigers durch die Summe aller Knotengrade beschränkt werden kann, welcher O(m) ist. In Zeile 6 können die Knoten mit Grad < i jeweils in konstanter Zeit gefunden werden, indem man auf Ldmin zugreift. Somit kostet ein Schleifendurchlauf für den Knoten v eine Laufzeit von O(resdegree[v]) = O(deg(v)). Da jeder Knoten nur einmal betrachtet wird, ergibt sich insgesamt: X O(deg(v)) = O(m). v∈V 2.1.2.4. Paralleler Algorithmus Die Verwendung einer Prioritätsliste ist im parallelen Fall nicht so einfach. Gleichzeitige Zugriffe von verschiedenen Threads müssen koordiniert werden, damit keine race conditions entstehen. Diese Koordination ist nicht kostenlos zu haben. Zwar existieren gute Forschungsarbeiten zu parallelen Prioritätslisten, aber häufig ist ein hemdsärmeligeres Vorgehen tatsächlich einfacher zu realisieren. So ersetzen auch die Autoren von ParK, einem parallelen Algorithmus zur k-Kern-Zerlegung, das sequentielle Vorgehen im Wesentlichen durch einen parallelen Array-Scan. Auf diese Weise vollbringt der parallele Algorithmus zwar mehr Arbeit, bei einer größeren Anzahl von Threads sinkt die Laufzeit in der Regel dennoch deutlich. Algorithmus 2.2 skizziert ParK, dessen Untermethoden in Algorithmus 2.3 und 2.4 dargestellt sind. 2.1.3. Clusterkoeffizienten und Transitivität 2.1.3.1. Motivation und Definition Stellen wir uns vor, uns gibt jemand einen Netzwerkdatensatz und behauptet, es sei ein soziales Netzwerk. Wie können wir diese Behauptung mit unseren bisherigen Mitteln überprüfen? Zunächst können wir uns die Gradverteilung anschauen. Ist diese nicht zumindest einigermaßen endlastig, sollten wir skeptisch werden. Ein weiteres einfaches Maß beruht auf der Überlegung, dass zwei gemeinsame Freunde derselben Person häufig auch miteinander befreundet sind – jedenfalls mit höherer Wahrscheinlichkeit als mit einer zufälligen Person im Netzwerk. Formalisieren wir diesen Gedanken zunächst. 18 2.1. Knotenzentralitätsmaße Algorithm 2.2 Paralleler Algorithmus zur Berechnung der k-Kern-Zerlegung 1: procedure ParK(G = (V, E)) 2: Initialisiere resdeg 3: curr ← ∅ 4: next ← ∅ 5: todo ← n 6: level ← 1 7: while todo > 0 do 8: scan(resdeg, level, curr) 9: while |curr| > 0 do 10: todo ← todo - |curr| 11: processSublevel(resdeg, level, curr, next) 12: curr ← next 13: next ← ∅ 14: end while 15: level++ 16: end while 17: end procedure • Der lokale Cluster-Koeffizient eines Knotens v ist definiert als: Definition 2.14. C(v) := Zahl der Dreiecke mit v Zahl der Tripel (Pfade der Länge 2) mit v als zentralem Knoten • Der durchschnittliche lokale Clusterkoeffizient eines Graphen G ist definiert als: 1 X Clocal (G) := 0 C(v) |V | 0 v∈V Beispiel 2.15. (1, (1, (1, (2, (2, (2, (2, (2, (2, (3, (3, (3, (3, (3, (3, (3, 2, 2, 2, 3, 3, 3, 4, 4, 5, 2, 2, 2, 4, 4, 5, 6, 3) 4) 5) 4) 5) 6) 3) 6) 3) 1) 4) 5) 2) 6) 2) 4) (4, (4, (4, (4, (4, (4, (4, (5, (5, (5, (5, (5, (5, (6, (6, (6, (6, (6, 2, 2, 2, 3, 3, 3, 6, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 1) 3) 5) 2) 5) 6) 3) 1) 3) 4) 2) 4) 6) 2) 4) 5) 2) 3) 19 2. Zentralitätsmaße Algorithm 2.3 Untermethode ProcessSublevel von ParK 1: procedure ProcessSublevel(G = (V, E), resdeg, level, curr, next) 2: idx ← 0 3: for each v ∈ curr do in parallel 4: core[v] ← level 5: for each u ∈ N (v) do 6: if resdeg[u] > level then 7: a ← atomicDec(resdeg[u], 1) 8: if a = level then 9: b ← atomicInc(idx, 1) 10: next[b] ← u 11: end if 12: end if 13: end for 14: end for 15: end procedure Algorithm 2.4 Untermethode Scan von ParK 1: procedure Scan(G = (V, E), resdeg, level, curr) 2: 3: 4: 5: 6: 7: 8: 9: 10: idx ← 0 for i ← 0 to n-1 do in parallel if resdeg[i] = level then a ← atomicInc(idx, 1) curr[a] ← i end if end for end procedure 2.1.3.2. Exakte Berechnung Die exakte Berechnung der Clusterkoeffizienten ist ziemlich aufwändig und daher für große Graphen ungeeignet. Ein naiver Ansatz iteriert über alle Knoten v ∈ V und Paare von Nachbarn von v. Dabei wird geprüft, ob die beiden Nachbarn im aktuellen Paar auch miteinander durch eine Kante verbunden sind. Dieser Ansatz hat eine WorstCase-Komplexität von O(n · ∆(G)2 ). Auch eine parallele Iteration ändert nichts daran, dass dies für große Graphen mit einigermaßen häufig auftretenden hohen Knotengraden ungeeignet ist. Denn hier ergibt sich in der Praxis häufig (nahezu) kubische Laufzeit. Der asymptotisch schnellste bekannte exakte Ansatz beruht auf schneller MatrixMultiplikation. 20 2.1. Knotenzentralitätsmaße 2.1.3.3. Approximation Wir gehen aufgrund der hohen asymptotischen Laufzeit eines exakten Ansatzes hier (auch) den Weg der Approximation und betrachten Algorithmus 2.5 von Schank und Wagner [SW05]. Dieser ist ein Sampling-Algorithmus mit Stichprobengröße k, wobei k ein Parameter ist. In jeder Runde wird zunächst ein zufälliger Knoten r aus der Menge V 0 := V \{v ∈ V : deg(v) ≤ 1} gezogen. Die Knoten mit Grad kleiner oder gleich eins lässt man aus, weil diese nicht Teil eines Tripels sein können. Zu r bestimmt man zwei zufällige (unterschiedliche) Nachbarn. Danach prüft man, ob die beiden Nachbarn selbst durch eine Kante verbunden sind. Falls ja, wird der Zähler l erhöht. Die Variable l speichert somit die Zahl der gefundenen Dreiecke. Somit drückt der Rückgabewert kl das Verhältnis von gefundenen Dreiecken zu untersuchten Tripeln aus. Algorithm 2.5 1: function ApproximateLocalCK(G = (V, E), k) 2: l←0 3: for i ← 1 to k do 4: r ← UniformRandomNumber(1, |V 0 |) 5: u ← UniformRandomNeighbor(Ar ) 6: repeat 7: w ← UniformRandomNeighbor(Ar ) 8: until u 6= w 9: if {u, w} ∈ E then 10: l ←l+1 11: end if 12: end for 13: return l/k 14: end function approx (G) ∈ Theorem 2.16. Für einen ungerichteten Graphen G = (V, E) kann ein Wert Clocal ν−1 [Clocal (G) − , Clocal (G) + ] mit Wahrscheinlichkeit mindestens ν in der erwarteten ν Zeit O( log ) berechnet werden. 2 Beweis. Bzgl. der Laufzeit können wir zunächst annehmen, dass die zufällige Auswahl eines Knotens bzw. Nachbarns in konstanter Zeit möglich ist. Die Zeitkomplexität der Prüfung, ob eine Kante im Graphen vorhanden ist, hängt von der Graphdatenstruktur ab. In sortierten Adjazenzlisten benötigt sie O(log n); nutzt man effizientes Hashing, geht die Prüfung in erwartet konstanter Zeit. Falls man dann k := dln(2ν)/(22 ) setzt, ν ). ergibt sich die erwartete asymptotische Laufzeit von O( log 2 Um die Korrektheit unserer Wahl von k zu beweisen, benutzen wir Hoeffdings Schranke: Sei Xi eine unabhängige reelle Zufallsvariable, die für alle i durch 0 ≤ Xi ≤ M beschränkt ist. Falls k die Größe der Stichprobe sowie > 0 eine Fehlerschranke ange- 21 2. Zentralitätsmaße ben, gilt: k # ! " k 1 X X −2k2 1 Pr Xi − E Xi ≥ ≤ 2 exp k k M2 i=1 (2.3) i=1 Wir müssen nun beweisen, dass der Erwartungswert E(l/k) gleich Clocal (G) ist und dass die gewünschten Schranken für unsere Wahl von k gelten. Sei dazu Π(G) die Menge aller Tripel in G und Π(v) [∆(v)] die Menge der Tripel [Dreiecke] mit v als ( Zentrum. Außerdem sei Υ ∈ Π(G) ein beliebiges Tripel von G. 1 , falls Υ Dreieck Dann ist X(Υ) = eine Indikatorabbildung von Π(G) nach {0, 1}. 0 , sonst Weiterhin gilt: Clocal (G) = 1 X |∆(v)| |V 0 | |Π(v)| 0 v∈V = 1 X X X(Υ) |V 0 | |Π(v)| 0 v∈V Υ∈Π(v) Die Wahrscheinlichkeit, dass ein bestimmtes Tripel Υ mit Zentrum v ∈ V 0 gezogen 1 wird, ist |V 0 ||Π(v)| . Also gilt wegen der Linearität des Erwartungswertes: E[l/k] = (2) = k 1X 1 E[l] = E[X(Υi )] k k i=1 X X 1 X(Υ) · 0 |V ||Π(v)| 0 v∈V Υ∈Π(v) = 1 X |∆(v)| |V 0 | |Π(v)| 0 v∈V = Clocal (G). Gleichung (2) gilt dabei oben, weil wir zunächst statt über die Tripel der k Runden über jedes einzelne Tripel summieren. Wir kennen Υi aus Runde i ja nicht und sehen alle Tripel als gleich wahrscheinlich an. Dann schreiben wir noch den Erwartungswert in seine Definition aus Ereigniswert mal Wahrscheinlichkeit des Ereignisses um. Da die Zufallsvariable X(Υi ) eine Abbildung von Π(G) nach {0, 1} ist, gilt M = 1 in Hoeffdings Schranke. Daher gilt mit unseren Werten für Ungleichung (2.3): k " k # ! 1 X −2dln(2ν)/(22 )e2 1X Pr ≤ 2 exp Xi − E Xi ≥ k k 1 i=1 i=1 ≤ 2 exp(− ln(2ν)) 1 = ν Daraus folgt die Behauptung für unsere Wahl von k. 22 2.1. Knotenzentralitätsmaße 2.1.4. Eigenvektor-Zentralität Die k-Kern-Zerlegung bzw. die Kernzahl hatten wir im Kontext von Zentralität bereits damit motiviert, dass sie robuster ist als die Grad-Zentralität. Es macht nun mal in vielen Fällen einen Unterschied, wie wichtig die eigenen Nachbarn sind, um die eigene Wichtigkeit zu beurteilen. Dieser Ansatz liegt auch der Eigenvektor-Zentralität zu Grunde. Dabei soll der Zentralitäts-Wert eines Nachbarn proportional in den eigenen Zentralitäts-Wert EC(v) für v ∈ V eingehen: ! EC(v) = X ω(vu) · EC(j) u∈N (v) In algebraischer Schreibweise ergibt sich analog (mit x als Zentralitätsvektor): X xv = Avu xu (2.4) u Daraus ergeben sich unmittelbar zwei Fragen: (i) Existiert so ein Vektor x überhaupt? (ii) Wie berechnen wir den Vektor x, falls er existiert? Dazu stellen wir Gleichung (2.4) in Matrix-Vektor-Schreibweise dar, die bereits ein iteratives Vorgehen beschreibt: x(t+1) = Ax(t) (2.5) Diese Darstellung sollte uns an unsere Vorkenntnisse aus der linearen Algebra erinnern (siehe auch Kapitel A). Dann können wir den Zusammenhang zu Eigenwerten und Eigenvektoren herstellen. Aus Definition A.3 folgt, dass der stationäre Zustand von Gleichung (2.5), sofern er existiert, ein Eigenvektor ist: Ax = λx (2.6) für einen Eigenwert λ. Man bezeichnet das iterative Vorgehen von Gleichung (2.5) als Potenzmethode (engl. power iteration). Seine Konvergenz hängt von den Eigenwerten λi von A ab, wie wir sehen werden. Seien die Eigenwerte dazu absteigend nach betragsmäßiger Größe sortiert. Außerdem gilt wegen Theorem A.4 unmittelbar: Folgerung 2.17. Die Adjazenzmatrix A eines ungewichteten ungerichteten Graphen besitzt n unterschiedliche Eigenvektoren z (1) , . . . , z (n) ∈ Rn , die in Rn eine Basis bilden. Ferner gilt z (i) ⊥ z (j) für alle 1 ≤ i 6= j ≤ n. Die Eigenwerte von A liegen zwischen −dmax und dmax , wobei dmax den maximalen Knotengrad in G darstellt. Zudem lässt sich etwas über den führenden Eigenwert sowie die Einträge des dazu korrespondierenden Eigenvektors einer Adjazenzmatrix aussagen: Lemma 2.18. Der betragsmäßig größte Eigenwert einer Matrix mit nicht-negativen Einträgen ist nicht-negativ. Beweis. Siehe Newman [New10a, S. 346f.]. Die Aussage ist im Übrigen Teil des berühmten Perron-Frobenius-Theorems. 23 2. Zentralitätsmaße Lemma 2.19. Die Einträge des führenden Eigenvektors einer nicht-negativen Matrix haben alle dasselbe Vorzeichen (s. [New10a, S. 346f.]). Weil die Eigenvektoren z (i) von A eine Basis bilden, lassen sich Vektoren des Rn auch in dieser BasisP repräsentieren. Dementsprechend sei die Eigenvektor-Zerlegung von (0) x gegeben durch ni=1 ci z (i) für geeignete reelle Konstanten ci und die normalisierten Eigenvektoren z (i) . Dann gilt: X X x(t) = At ci z (i) = ci λti z (i) (2.7) i = λt1 X i ci λi λ1 t i z (i) . (2.8) Weil |λi | < λ1 für alle 2 ≤ i ≤ n, fallen alle Terme außer dem ersten exponentiell gegen 0 ab. Für t → ∞ konvergiert die Summe demnach gegen den ersten Term: x(t) → c1 λt1 z (1) . Der Vektor z (1) ist der zu λ1 korrespondierende Eigenvektor, so dass der stationäre Zustand zu z (1) proportional ist. Da die Proportionalität für die Rangfolge irrelevant ist, können wir festhalten: Definition 2.20. Die Eigenvektor-Zentralität ordnet jedem Knoten v ∈ V den v-ten Eintrag im Eigenvektor zum größten Eigenwert von A zu. Das Ziel der Proportionalität zu den Zentralitätswerten der Nachbarn haben wir nun erreicht: Lemma 2.21. EC(v) ist proportional zu den Nachbarn von v für alle v ∈ V : X Avu xu xv = λ−1 1 u Beweis. Selbstübung. Die Eigenvektor-Zentralität eines Knotens kann demnach groß sein, weil (i) ein Knoten vielen Nachbarn hat, (ii) die Nachbarn eine hohe Eigenvektor-Zentralität haben oder (iii) beides gilt. Es ist zwar keine zwingende Bedingung, aber die meisten Zentralitätsmaße bilden auf nicht-negative Werte ab. Insofern ist es interessant festzuhalten, dass dies auch für die Eigenvektor-Zentralität gilt: Folgerung 2.22. Aus Lemma 2.19: Der Zentralitätsvektor x mit Ax = λ1 x lässt sich so normalisieren, dass xv ≥ 0 ∀v ∈ V gilt. 2.1.4.1. Besonderheiten bei gerichteten Graphen Die Eigenvektor-Zentralität ist prinzipiell auf ungerichtete und gerichtete Graphen anwendbar. Allerdings ist zu beachten, dass man bei gerichteten Graphen eine unsymmetrische Adjazenzmatrix erhält. Eine unsymmetrische Matrix hat einen linken und einen rechten Eigenvektor. Welchen würde man also nehmen? 24 2.1. Knotenzentralitätsmaße Abbildung 2.3.: Gerichteter Graph, dessen Knoten allesamt Eigenvektor-Zentralität 0 haben. Betrachten wir dazu als Anwendungsbeispiel analog zu Newman [New10a] den WebGraphen, der aus Webseiten (= Knoten) und Links (= Kanten) besteht. Eine Webseite ist sicherlich wichtiger, wenn viele andere Seiten auf sie verlinken als umgekehrt. Also sollte die Eigenvektor-Zentralität proportional zu den Zentralitäten der eingehenden Nachbarn sein: X xi = κ−1 Aji xj 1 j Dies ergibt in der Matrix-Vektor-Darstellung xA = κ1 x, wobei x der führende linke Eigenvektor ist. Beachten Sie hier wieder die Abweichung zu Newman, die durch die umgekehrte Richtung der Kanten in der Adjazenzmatrix herrührt. Weiterhin ist zu beachten, dass die Eigenvektor-Zentralität nur in zusammenhängenden (ungerichtet) bzw. stark zusammenhängenden (gerichtet) Graphen sinnvoll anwendbar ist. Um dies einzusehen, betrachten wir den gerichteten Graphen in Abbildung 2.3. Knoten mit Eingangsgrad 0 haben offensichtlich auch Eigenvektor-Zentralität 0 (Selbstübung: warum?). Dieser Wert gilt demnach für den Knoten A. Die wichtige Beobachtung ist nun, dass diese Eigenschaft kaskadiert. Knoten B und alle anderen Knoten des Graphen haben somit auch Eigenvektor-Zentralität 0. 2.1.4.2. Berechnung Bei der Potenzmethode ist die Wahl der Startlösung nicht schwierig, darf aber auch nicht beliebig sein. Insbesondere gilt wegen Lemma 2.19 zu beachten: Folgerung 2.23. Wähle einen Startvektor x(0) , in dem alle Einträge ein positives Vorzeichen haben. Um die Konvergenz im Algorithmus festzustellen, kann man bspw. zwei verschiedene Startvektoren wählen und diese nach einer Normalisierung in jeder Iteration (oder alle paar Iterationen) miteinander vergleichen. Die Normalisierung ist auch ohne die Verwendung von zwei Vektoren notwendig, da sonst die Werte im Rechner schnell überlaufen würden. 25 2. Zentralitätsmaße Nach der Konvergenz lässt sich auch der Eigenwert leicht berechnen. Dazu muss man nur einen Eintrag des Eigenvektors vor und nach einer weiteren Iteration durcheinander teilen (wegen numerischer Ungenauigkeiten sollte man aber über mehrere Einträge mitteln). Auch wenn die Eigenvektor-Zentralität nicht zu den beliebtesten (aber durchaus zu den etablierten) Maßen gehört, lohnt sich ein Blick auf die Zeitkomplexität der Potenzmethode. Dieser Algorithmus ist nämlich auch in anderen Situationen einsetzbar, so auch im nächsten Abschnitt. Zunächst können wir festhalten, dass jede Iteration mit einer geeigneten Datenstruktur (etwa: Adjazenzarray) in O(m) zu realisieren ist, da die wesentliche Operation ein Matrix-Vektor-Produkt ist. Für dünne Graphen, die in unserem Kontext meist vorliegen, ergibt sich somit O(n). Bleibt zu zeigen, wie viele Iterationen wir brauchen. Wie wir bereits in Gleichung (2.8) gesehen haben, hängt die Konvergenz von den Eigenwerten λi von A ab. Der Ausdruck wird maßgeblich vom Quotienten aus dem betragsmäßig zweitgrößten Eigenwert λ2 und dem betragsmäßig größten Eigenwert λ1 bestimmt. Diesen gilt es zu analysieren. Wegen Lemma 2.18 und unseren Vorüberlegungen gilt nach t Iterationen: x (t) = λt1 n X ci i=1 ⇒ c2 x(t) = z (1) + t c1 λ1 c1 | λi t (i) z λ1 t λ2 z (2) + . . . λ1 {z } Hauptfehlerterm Der mittlere Fehler (RMSD) im Eigenvektor ist dann (bei Vernachlässigung niederer Terme und unter Berücksichtigung von kz (2) k = 1): s 2 x(t) c2 λ2 t (1) c1 λt − z = c1 λ1 1 Falls dieser Fehler höchstens sein soll, muss gelten: t≥ ln(1/) + ln(c2 /c1 ) ln(λ1 /λ2 ) Als Selbstübung kann die Leserin die Umformung selbst nachvollziehen. Beachten Sie, dass weder noch die Konstanten c1 und c2 von der Größe des Netzwerks abhängen! Also ergeben sich Variationen in der Laufzeit allein durch die Eigenwerte λ1 und λ2 . Wir wissen: λn ≥ −|λ1 |. Daraus können wir schließen, dass der mittlere Abstand höchstens 2λ1 /(n−1) ist. Eine ausreichend genaue Abschätzung für λ2 ist daher, dass λ2 proportional zu λ1 − aλ1 /n ist, wobei a eine Konstante der betrachteten Größenordnung ist. Also: λ1 a (1) a ' − ln 1 − = + O(n−2 ). ln λ2 n n 26 2.1. Knotenzentralitätsmaße Umformung (1) folgt dabei aus limn→∞ (1 − na )n = e−a . Zusammen ergibt das t = O(n) Schritte, bis die Potenzmethode zur führenden Ordnung konvergiert. Dies ist allerdings eine pessimistische Abschätzung. In der Praxis wird Konvergenz in der Regel deutlich schneller erreicht. Meist zeigt sich ein nahezu lineares Laufzeitverhalten (in m) bei der Analyse komplexer Netzwerke, wenn die Genauigkeit nicht zu niedrig gewählt wird. 2.1.5. PageRank 2.1.5.1. Kontext Ende der 1990er Jahre waren Suchmaschinen teilweise noch katalogbasiert. Es gab nur wenige, die tatsächlich suchbasiert arbeiteten, d. h. auf eine beliebige Anfrage hin eine Liste möglichst relevanter Webseiten präsentierten. Die Ergebnisse waren zu jener Zeit auch nicht besonders zufriedenstellend. Diese Situation wurde durch eine Firma maßgeblich verändert, die von zwei Informatik-Doktoranden der Stanford University gegründet wurde: Google. Die beiden Gründer, Sergey Brin und Larry Page, hatten zuvor den PageRank-Algorithmus entwickelt und veröffentlicht [BP12]. Dieser bildete die Grundlage für das Ranking von Suchergebnissen. Dem PageRank-Algorithmus liegt das Modell des Zufallssurfers zu Grunde. Dabei gehen wir davon aus, dass das WWW durch einen Graphen modelliert wird – jeder Knoten ist eine Webseite und Links auf einer Webseite werden durch eine ausgehende gerichtete Kante modelliert. Ein Zufallssurfer bewegt sich nun zufällig in diesem Graphen. Ist er auf einer Seite (= Knoten), klickt er entweder auf einen Link oder gibt eine neue URL in die Adresszeile des Browsers ein. Im Graphen bedeutet das Verfolgen eines Links, dass ein benachbarter Knoten besucht wird. Dabei wird ein Link (= Nachbar) zufällig gleichverteilt unter allen Links ausgewählt. Im Gegensatz zur Linkverfolgung bedeutet das Eintippen einer neuen URL, dass man auf einen beliebigen Knoten im Graphen “teleportiert” wird. Ein Beispiel-Graph mit seinen PageRank-Werten sehen wir in Abbildung 2.4. Der Knoten B ist dort wichtig, weil viele andere Knoten auf ihn zeigen. Knoten C profitiert von der Popularität von B, da B nur auf C zeigt. Wir sehen außerdem, dass ein Problem der Eigenvektor-Zentralität nicht mehr auftritt. Knoten mit Eingangsgrad 0 haben hier positiven PageRank. Mathematisch wird dies durch die Teleportation erreicht. 2.1.5.2. Etwas Mathematik hinter PageRank Wir werden feststellen, dass der PageRank-Vektor x der stationäre Zustand eines stochastischen Prozesses ist und letztlich auch ein Eigenvektor. Allerdings ist x kein Eigenvektor zu A, sondern zur sogenannten Google-Matrix – wodurch die angesprochenen Probleme der Eigenvektor-Zentralität umgangen werden. Um die Google-Matrix von unserer üblichen Notation eines Graphen zu unterscheiden, stellen wir sie als G dar. Wir benötigen außerdem folgende Objekte: (i) einen Dämpfungsfaktor α, der die Teleport-Wahrscheinlichkeit angibt, (ii) eine Transitionsmatrix P , die die Linkverfolgung modelliert und (iii) einen stochastischen Teleport-Vektor 27 2. Zentralitätsmaße Abbildung 2.4.: Ein gerichteter Graph, bei dem die Knotengröße den PageRank des Knoten visualisiert. Quelle: https://en.wikipedia.org/wiki/PageRank. y. Üblicherweise setzt man y := 1/n. Somit wird jede Webseite mit gleicher Wahrscheinlichkeit in die Adresszeile eingetippt (auch wenn das realitätsfern ist). Beobachtung 2.24. Die möglichen Zustandsübergänge eines Zufallssurfers lassen sich durch die Google-Matrix G := αP + (1 − α)1y T beschreiben. Dabei ist die Transitionsmatrix P der Linkverfolgung durch Pij := Aij / deg(i) beschrieben – oder in Matrixschreibweise: P = D−1 A. Der Ausdruck Pij gibt somit die Wahrscheinlichkeit an, dass man den Link von Seite i zu Seite j verfolgt (man beachte wieder, dass wir hier gegenüber Newman die umgedrehte Richtung der Kanten in A verwenden). Die konkreten numerischen Ergebnisse hängen zwar von der Wahl von α und y ab; sinnvolle Werte beeinflussen das Ranking aber kaum. Beobachtung 2.25. Der stochastische Prozess des Zufallssurfers startet mit einer Wahrscheinlichkeitsverteilung x(0) (einem stochastischer Vektor). Die weiteren Übergänge werden durch die Iteration (x(t+1) )T := (x(t) )T G (2.9) beschrieben. Zur Selbstübung sei der Leserin empfohlen, die Iteration für einen konkreten Eintrag (t+1) v nachzuvollziehen. Dann sieht man, dass sich xv aus den Wahrscheinlichkeitsmas(t) sen xu der Nachbarn u von v, gewichtet um die Übergangswahrscheinlichkeiten Guv , zusammensetzt. Man kann sich leicht davon überzeugen, dass die Matrizen P und G spaltenstochastisch sind; wir tun dies hier nur für G: 28 2.1. Knotenzentralitätsmaße Lemma 2.26. G ist zeilenstochastisch. Beweis. Für einen einzelnen beliebigen Eintrag von G gilt: Guv = αPuv + (1 − α)(1y T )uv = α(D−1 A)uv + (1 − α)yv Auv + (1 − α)yv =α· Duu Somit folgt für eine beliebige Zeile 1 ≤ u ≤ n: X v X Auv + (1 − α)yv Duu v X α X = Auv + (1 − α) yv Duu v v Guv = α· = α + (1 − α) = 1 Wir können wir nun folgern: Lemma 2.27. Der größte Eigenwert von G ist 1 und er ist einfach. Zu diesem Eigenwert korrespondiert der rechte Eigenvektor 1. Beweis. Dass 1 rechter Eigenvektor zum Eigenwert 1 ist, folgt aus Lemma 2.26. Aus diesem Lemma und Proposition A.5 folgt, dass 1 der größte (rechte) Eigenwert ist. Da G quadratisch ist, sind die linken und rechten Eigenwerte aber gleich, so dass es keinen größeren geben kann. Da G > 0 (elementweise größer als 0), folgt außerdem aus dem Satz von Perron-Frobenius (Theorem A.6), dass 1 einfacher Eigenwert ist und alle anderen betragsmäßig kleiner sind. Iteration (2.9) ist wiederum eine Linksmultiplikation. Nach unseren Vorüberlegungen muss diese gegen den linken Eigenvektor zum Eigenwert 1 konvergieren. Dieser Eigenvektor ist der sogenannte PageRank-Vektor, den wir suchen. Definition 2.28. Die PageRank-Zentralität des Knotens v ergibt sich aus dem v-ten Eintrag des PageRank-Vektors x. Dieser Vektor wird in der Markov-Ketten-Forschung traditionell als π bezeichnet und ist der dominante linke Eigenvektor von G: π T = π T G. Will man nun den PageRank-Vektor zur Bestimmung der Zentralität berechnen, kann man somit wie bei der Eigenvektor-Zentralität die Potenzmethode verwenden. Dies war auch tatsächlich das Vorgehen bei Google bei seiner Gründung. Zwar ist die Potenzmethode kein universell guter Eigenlöser, aber sie funktioniert sehr gut auf Web-Graphen und ist außerdem sehr leicht zu parallelisieren – eine wichtige Eigenschaften bei Graphen mit Milliarden von Knoten und Kanten. Der Algorithmus sieht dann folgendermaßen aus: 1. Starte mit initialem Vektor x(0) 29 2. Zentralitätsmaße 2. Berechne (x(t+1) )T = (x(t) )T G 3. Normalisiere x 4. Wenn nicht konvergiert: gehe zu 2.) Die Konvergenzgeschwindigkeit der Potenzmethode für die Berechnung des PageRank hängt ähnlich wie bei der Eigenvektor-Zentralität vom zweitgrößten Eigenwert ab (bzw. vom Quotienten aus zweitgrößtem und größtem, aber hier ist der größte gleich 1). Da der zweitgrößte Eigenwert von G bei Web-Graphen meist weit genug weg von der 1 liegt, kann man den PageRank auch für große Graphen in akzeptabler Zeit berechnen – geeignete Hardware vorausgesetzt. Der PageRank hat sich aufgrund des überlegenen Rankings von Google schnell durchgesetzt. Heute ist er allerdings nur ein Kriterium unter vielen bei der Bildung der Rangfolge von Suchergebnissen. 2.1.6. Betweenness Centrality Eins der am meisten beachteten Zentralitätsmaße ist die betweenness centrality. Ihr deutscher Name Intermediationszentralität ist wenig gebräuchlich – wir werden daher auch im Deutschen meist den englischen Begriff verwenden. In der Folge gehen wir der einfacheren Darstellung wegen von zusammenhängenden Graphen aus, falls nichts Anderes vermerkt ist. Die Betweenness Centrality (BC) sieht einen Knoten als wichtig an, wenn ein hoher Anteil kürzester Wege über ihn verlaufen. Formal definieren wir: Definition 2.29 (Betweenness Centrality). Sei σst = σts die Zahl der kürzesten Wege zwischen s und t. Zudem sei σst (v) = σts (v) die Zahl der kürzesten Wege zwischen s und t, auf denen der Knoten v (als Zwischenknoten) liegt. Dann ist die (nicht normalisierte) Betweenness Centrality eines Knotens v ∈ V in einem ungerichteten Graphen definiert als: BC(v) := X s6=v6=t∈V σst (v) σst (2.10) Man summiert also über alle geordneten Knotenpaare (s, t), wobei s und t ungleich sind. Außerdem dürfen weder s noch t gleich v sein. Für ein solches Paar addiert man dann den Anteil der kürzesten Wege zwischen s und t, die auch über v laufen. Hinter dieser Definition steckt die Annahme, dass sich bspw. Informationen über kürzeste Wege im Netzwerk ausbreiten. Eine Person mit hoher BC in einem sozialen Netzwerk ist wichtig, weil sie den Informationsfluss kontrollieren kann. Um uns der effizienten Berechnung der BC zu nähern, interpretieren wir Teile der Summe neu: Definition 2.30 (Paar-Abhängigkeit). Die Paar-Abhängigkeit eines Knotens v ist gegeben durch: δst (v) = σst (v)/σst 30 2.1. Knotenzentralitätsmaße Folglich ist BC(v) = X s6=v6=t∈V = X σst (v) σst (2.11) δst (v) (2.12) s6=v6=t∈V die Summe über die Paar-Abhängigkeiten von v. Ein naiver Algorithmus würde nun die Zahl der kürzesten Wege zwischen allen Knotenpaaren sowie für jeden Knoten die Summe der Paar-Abhängigkeiten berechnen. Zur Einordnung erinnern wir uns an unsere Algorithmik-Grundvorlesung und die Laufzeiten von Dijkstras Algorithmus bzw. von Breitensuche zur Lösung eines einzelnen singlesource shortest path (SSSP) Problems: Lemma 2.31. Sei ein Startknoten s ∈ V gegeben. Die Zahl und Länge aller kürzesten Pfade zu allen anderen Knoten lässt sich in O(m + n log n) Zeit für gewichtete Graphen berechnen (in O(m + n) für ungewichtete). Es gibt allerdings quadratisch viele Paar-Abhängigkeiten. Somit hätte das naive Vorgehen mindestens kubischen Aufwand in n. 2.1.6.1. Effiziente Berechnung der BC-Werte Eine wesentliche Einsicht zur Beschleunigung des naiven Algorithmus ist, dass beim obigen Vorgehen Zwischenergebnisse mehrfach berechnet werden. Einmal berechnete Zwischenergebnisse sollte man mehrfach verwenden. Der nachfolgende Algorithmus stammt von Ulrik Brandes [Bra01] und ist der schnellste bekannte Algorithmus, der die Betweenness-Werte exakt berechnet. Zunächst benötigen wir dazu das Vorgänger-Konzept; dazu müssen wir uns noch überlegen, unter welchen Umständen ein Knoten Teil eines kürzesten Weges ist (ohne Beweis, da Teil von Grundvorlesungen). Lemma 2.32. Ein Knoten v liegt genau dann auf dem kürzesten Pfad zwischen s und t, wenn dist(s, v) + dist(v, t) = dist(s, t) gilt. Definition 2.33 (Vorgänger). Die Menge der Vorgänger von v auf einem kürzesten Pfad von s schreiben wir als Ps (v) = {u ∈ V : {u, v} ∈ E, distG (s, v) = distG (s, u) + ω(u, v)}. Die Zahl der kürzesten Wege von s nach v kann man berechnen, indem man die Zahl der kürzesten Wege von s zu den Vorgängern von v summiert (der Beweis sei der Leserin zur Übung empfohlen): P Lemma 2.34. Für s 6= v ∈ V gilt: σsv = u∈Ps (v) σsu . Unser Ziel ist nun, nicht alle Paar-Abhängigkeiten summieren zu müssen. Wir betrachten anstelle von Paaren daher (gedanklich) Abhängigkeiten eines einzelnen Knotens: P Definition 2.35 (Abhängigkeit eines Knotens s). δs• (v) = t∈V δst (v). 31 2. Zentralitätsmaße Abbildung 2.5.: Akkumulation der Abhängigkeiten im Beweis von Theorem 2.37. Quelle: Brandes [Bra01]. Die entscheidende Einsicht ist, dass diese Summen eine rekursive Beziehung haben: Lemma 2.36. Falls es exakt einen kürzesten Weg von s ∈ V zu jedem t ∈ V gibt, dann gilt für die Abhängigkeit von s von jedem anderen v ∈ V : X δs• (v) = (1 + δs• (w)). w:v∈Ps (w) Für einen Knoten v lässt sich seine Abhängigkeit demnach aus den Abhängigkeiten seiner Nachfolger berechnen – also der Knoten w, für die v Vorgänger auf einem kürzesten Weg ist. Der Beweis dieses Lemmas bietet sich als Übungsaufgabe an. Der allgemeinere Fall wird als nächstes bewiesen. Hat man dessen Beweis verstanden, fällt der Beweis des Spezialfalls leicht. Theorem 2.37. Für die Abhängigkeit δs• (v) eines Startknotens s ∈ V zu einem anderen Knoten v ∈ V gilt: X σsv δs• (v) = · (1 + δs• (w)). σsw w:v∈Ps (w) Beweis. Die Eigenschaft δst (v) > 0 gilt nur für solche t ∈ V \{s}, für die v auf mindestens einem kürzesten Pfad von s nach t liegt. Auf jedem dieser Pfade gibt es genau eine Kante {v, w} mit v ∈ Ps (w). Siehe dazu auch Abbildung 2.5. Wir erweitern nun das Konzept der Paar-Abhängigkeit durch den Einbezug einer Kante e ∈ E anhand der Definition δst (v, e) := σst (v, e) . σst Dabei ist σst (v, e) die Zahl der kürzesten Pfade von s nach t, die sowohl v als auch e enthalten. Dann gilt: X X X δs• (v) = δst (v) = δst (v, {v, w}) (2.13) t∈V 32 t∈V w:v∈Ps (w) 2.1. Knotenzentralitätsmaße = X X δst (v, {v, w}). (2.14) w:v∈Ps (w) t∈V Sei nun w ein beliebiger Knoten mit v ∈ Ps (w). Von den σsw kürzesten Pfaden von s nach w verlaufen σsv Stück von s nach v und dann über {v, w}. Folglich beinhalten σsv σsw · σst (w) kürzeste Pfade von s nach t 6= w den Knoten v und die Kante {v, w}. Also ist die Paar-Abhängigkeit von s und t bgzl. v und {v, w}: ( σsv falls t = w δst (v, {v, w}) = σσsw (2.15) σst (w) sv sonst σsw · σst (2.16) Wir setzen dies in Formel (2.14) ein und beachten dabei, dass w 6= s genau einmal Endpunkt (also = t) des kürzesten Weges von s ist: X X δst (v, {v, w}) (2.17) w:v∈Ps (w) t∈V X σ σ σ (w) sv st sv + = · σsw σsw σst w:v∈Ps (w) t∈V \{w} X σst (w) X σsv . · 1+ = σsw σst X = (2.19) t∈V \{w} w:v∈Ps (w) (Def. 2.35) (2.18) X w:v∈Ps (w) σsv · (1 + δs• (w)). σsw (2.20) Wie nutzen wir diese rekursive Beziehung nun algorithmisch aus? Die Grundidee ist, n SSSP-Probleme zu lösen und dabei temporäre BC-Werte zu akkumulieren. Bei der Berechnung der kürzesten Wege von einem Startknoten s ∈ V in G entsteht implizit ein DAG. Wenn wir ihn auf die Kanten der ersten Entdeckung eines Knotens reduzieren, entsteht wiederum ein Baum T . Satz 2.38. Sei der oben beschriebene Baum T der kürzesten Pfade von einem Startknoten s ∈ V in G gegeben. Dann lassen sich die Abhängigkeiten von s zu allen anderen Knoten in Zeit O(m) und Platz O(n + m) berechnen. Beweis. Während einer Postorder-Traversierung lassen sich die Abhängigkeiten gemäß Theorem 2.37 akkumulieren. An jedem Knoten ist dafür nur konstante Zeit notwendig. Pro Knoten muss dazu ein Abhängigkeit und die Liste der Vorgänger gespeichert werden. Da es pro Kante höchstens ein Element in allen diesen Listen gibt, folgt die Behauptung. Der Algorithmus von Brandes lässt sich nun informell so beschreiben: 33 2. Zentralitätsmaße • Eingabe: G = (V, E), Ausgabe: BC-Werte für alle v ∈ V • Berechne n Kürzeste-Pfade-Bäume, einen pro s ∈ V , und währenddessen auch die Mengen Ps (v)! • Berechne für jedes jeweilige s ∈ V und alle anderen v ∈ V die Abhängigkeiten δs• (v) mit Hilfe des Baumes, der Vorgängermengen und des Theorems 2.37: – Starte an den Blättern des Baumes, arbeite dich per Postorder-Traversierung schrittweise zur Wurzel voran – Sei der aktuell betrachtete Knoten w. Akkumuliere den Abhängigkeitswert σ[v] des Startknotens s zu v ∈ Ps (w): δ[v] ← δ[v] + σ[w] · (1 + δ[w]). Akkumuliere dann den BC-Wert von w: BC(w) ← BC(w) + δ[w]. (Die Notation weicht hier bewusst leicht ab, um näher am Code zu sein und die Unterschiede von ProgrammVariablen und unserer mathematischen Notation zu verdeutlichen.) Theorem 2.39. Der Algorithmus von Brandes berechnet für Graphen mit nicht-negativen Kantengewichten die exakten BC-Werte in der Zeit O(nm + n2 log n) und benötigt dabei O(n + m) Speicher. Für ungewichtete Graphen reduziert sich die Laufzeit auf O(n(n + m)). Im Falle m = Ω(n) ergibt sich O(nm). Beweis. Es sind n SSSPs zu lösen. Laufzeit und Speicherverbrauch ergeben sich damit im Wesentlichen aus Lemma 2.31 und Proposition 2.38. Für dicht besetzte Graphen ergibt sich somit weiterhin kubische Laufzeit. In der Praxis haben wir es aber meist mit dünn besetzten Graphen zu tun. In dem Fall verbessern wir uns asymptotisch um den Faktor logn n bzw. n gegenüber dem naiven Algorithmus. Trotzdem ist die mindestens quadratische Laufzeit ein Problem hinsichtlich der Skalierbarkeit auf große Graphen. Für Millionen von Knoten und Kanten ist daher eigentlich nur eine approximative Lösung praktikabel. Geeignete Algorithmen dafür besprechen wir im nächsten Abschnitt. 2.1.6.2. Approximation der BC-Werte Für diesen Abschnitt verweisen wir auf die Folien, die Elisabetta Bergamini in der Vorlesung bzw. Übung präsentiert hat. Es ist geplant, künftige Skript-Versionen zu diesem Thema weiter auszubauen. 2.1.7. Nähe- und harmonische Zentralität Informationen fließen in Netzwerken sicherlich meist auf kurzen Wegen zwischen zwei Knoten s und t, zumindest wenn der Prozess der Informationsverbreitung effizient ist. Nicht notwendigerweise sind es auch tatsächlich immer die kürzesten Wege, aber wir werden auch in diesem Abschnitt diese Annahme treffen. Dabei betrachten wir nun nicht deren Zahl bzw. Anteile, sondern deren Länge. 34 2.1. Knotenzentralitätsmaße Abbildung 2.6.: Wärmebild der Nähezentralität (rot = hoch, dunkelblau = niedrig), Quelle: Wikipedia. Der mittlere kürzeste Abstand eines Knotens v ∈ V ist definiert als 1X lv := dist(v, u). n u∈V Knoten, die sehr zentral in einem Netzwerk positioniert sind, summieren dabei tendenziell kleine Abstände. In einem sozialen Netzwerk können solche zentralen Personen Informationen viel schneller streuen. Im Unterschied dazu haben Knoten am Rand eines Netzwerks hohe Abstände zu vielen anderen Knoten, siehe auch Abbildung 2.6. Es dauert daher viel länger, bis eine Information von nicht zentralen Knoten bei allen anderen angelangt ist (unter der Annahme, dass diese sich nur auf einem kürzesten Weg ausbreitet). Ein Nachteil des mittleren kürzesten Abstands ist, dass zentrale Knoten niedrige Werte haben. Um dies auszugleichen, bilden wir den Kehrwert. Damit Knoten unterschiedlicher Netzwerke einigermaßen vergleichbar werden, normalisieren wir zusätzlich noch durch die Anzahl der Knoten, über die der Durchschnitt gebildet wird: Definition 2.40 (Nähezentralität). Die (normalisierte) Nähezentralität eines Knotens v ∈ V ist definiert als: 1X CloseC(v) := dist(v, u) (2.21) n u∈V Einige Autoren summieren in Formel (2.21) nur über die Knoten ungleich v. Dann erfolgt die Normalisierung mit n − 1 statt mit n – was aber auch die einzige Änderung ist, da der Abstand von v zu sich selbst 0 ist. NetworKit führt die Normalisierung mit n − 1 durch; analytische Ergebnisse sind laut Newman [New10b] eleganter, wenn man mit n normalisiert. 35 2. Zentralitätsmaße Ein weiteres Problem der Nähezentralität ist ihre Erweiterung auf unzusammenhängende bzw. nicht stark zusammenhängende Graphen. Man könnte natürlich nur über Knotenpaare einer Zusammenhangskomponente summieren. Dies hätte allerdings u. a. den Nachteil, dass das Einfügen einer Brückenkante zwischen zwei Komponenten gravierende Änderungen in den Zentralitätswerten nach sich ziehen würde. Besser erscheint da die harmonische Zentralität, die über die Kehrwerte der Distanzen summiert. Folgt man der Konvention, dass nicht verbundene Knoten den Abstand unendlich haben und der Kehrwert von unendlich 0 ist, ergibt sich: Definition 2.41 (Harmonische Zentralität). Die harmonische Zentralität eines Knotens v ∈ V ist definiert als: HC(v) := 1 X 1 . n−1 dist(v, u) (2.22) u∈V Beachten Sie, dass wir hier nur über n − 1 Terme summieren, denn der Term für u = v muss unbedingt ausgeschlossen werden. Der Grund dafür ist eine leichte Übungsaufgabe und erschließt sich direkt aus der Definition. Nähe- und harmonische Zentralität lassen sich auch heranziehen, um ein komplettes Netzwerk zu beurteilen. Für ein Netzwerk mit nur einer Zusammenhangskomponente lässt sich dazu die mittlere Nähezentralität heranziehen: l := 1X 1 X dist(v, u) = lv . n2 vu n v Bei mehreren Zusammenhangskomponenten ergibt sich wieder das weiter oben angesprochene Problem mit unendlich langen Abständen. Man kann dann beispielsweise nur über Knotenpaare aus derselben Komponente summieren. Alternativ – und nach den obigen Überlegungen vermutlich oft vorteilhaft – verwenden wir wieder die Summe harmonischer Abstände: n l0 := P . (2.23) v HC(v) Im Kapitel 3 widmen wir uns der effizienten Berechnung von Distanzen und kürzesten Wegen, wie wir sie zur Berechnung der obigen Zentralitätsmaße benötigen. 2.2. Top-k-Ranglisten* Es kann unter Umständen sehr viel schneller sein, die k Knoten mit der höchsten Zentralität zu berechnen, als die komplette Rangfolge zu bestimmen (natürlich nur, wenn k deutlich kleiner als n ist). Auf dieses Thema gehen wir in der Vorlesung aus Zeitgründen bestenfalls am Rande ein. Die interessierte Leserin sei für weitere Details auf eine aktuelle Arbeit zur Nähezentralität [BBC+ 16] verwiesen. 36 2.3. Kantenzentralitätsmaße* 2.3. Kantenzentralitätsmaße* Eine Reihe von Knotenzentralitätsmaßen lassen sich sehr einfach als Kantenzentralität umformulieren. Zudem gibt es eine ganze Reihe von Maßen, die nur für Kanten definiert wurden. Aus Zeitgründen werden wir darauf in der Vorlesung aber leider nicht genauer eingehen können. 2.4. Weiterführende Literatur Eine breite Übersicht zu Zentralitätsmaßen und ihren Eigenschaften liefert das Lehrbuch von Newman [New10a]. Etwas älter ist die Darstellung im von Brandes und Erlebach herausgegebenen Buch [BE05]. Sehr zu empfehlen ist der Artikel von Boldi und Vigna [BV14], der unter anderem eine Übersicht über viele bekannte Maße bietet und diese hinsichtlich einer Axiomatik beurteilt. Bezüglich der Rangfolgen für Webseiten genoss auch der hubs and Authorities genannte Algorithmus von Kleinberg [Kle99] Popularität. Allerdings hat der Erfolg von Google dazu geführt, dass PageRank in diesem Kontext stark dominiert. 37 3. Kürzeste Wege und globaler Zusammenhang 3.1. Paarweise Abstände und kürzeste Wege Zunächst betrachten wir zwei Algorithmen, die für jedes Knotenpaar den Abstand bzw. den kürzesten Weg berechnet. Ihre Laufzeit ist allerdings für größere Probleme in der Praxis ungeeignet. Wir werden daher einen weiteren Algorithmus kennenlernen, der nach einem Vorverarbeitungsschritt einzelne Anfragen sehr schnell abarbeiten kann. 3.1.1. Floyd-Warshall-Algorithmus Der Floyd-Warshall-Algorithmus zur Berechnung paarweiser Distanzen (bzw. paarweiser kürzester Wege) basiert auf der Idee, das Problem schrittweise zu vergrößern. In Iteration k werden alle Wege berücksichtigt, die über Knoten aus der Menge {1, . . . , k} verlaufen (direkte Kanten des Graphen eingeschlossen). Nach Ende der äußersten Schleife hat k den Wert n überschritten, so dass alle möglichen Wege berücksichtigt worden sind. Algorithm 3.1 Algorithmus von Floyd-Warshall zur Berechnung paarweiser Distanzen 1: function Floyd-Warshall-APD(G = (V, E)) 2: Ausgabe: Distanzmatrix D (n) 3: D(0) ← W 4: for k ← 1 to n do 5: for i ← 1 to n do 6: for j ← 1 to n do (k) (k−1) (k−1) (k−1) 7: dij ← min(dij , dik + dkj ) 8: end for 9: end for 10: end for 11: return D(n) 12: end function Theorem 3.1. Sei G = (V, E) ein Graph ohne negative Zyklen. Dann berechnet der Algorithmus von Floyd-Warshall die Entfernung zwischen jedem Knotenpaar in O(|V |3 ) Schritten. Der Beweis von Theorem 3.1 wird dem Leser als Übung empfohlen. 39 3. Kürzeste Wege und globaler Zusammenhang Bemerkung 3.2. Das als Algorithmus 3.1 angegebene Verfahren löst nur das Problem All-Pairs-Distances (APD), d. h. es werden die paarweisen Distanzen und nicht auch die zugehörigen kürzesten Wege berechnet. Eine entsprechende Erweiterung des Algorithmus für APSP wird der Leserin ebenfalls als Übungsaufgabe empfohlen. 3.1.2. Matrix-Multiplikation Kommen wir nun zu einem asymptotisch etwas schnelleren Algorithmus. Dazu betrachten wir ungerichtete ungewichtete Graphen G = (V, E), gegeben durch die Adjazenzmatrix A. Es seien D, W ∈ (R ∪ {∞})n×n quadratische Matrizen. Verwenden wir die Verknüpfungen (min, +) bei der Matrixmultiplikation, so gilt bekanntlich: (DW )ij = min {Dik + Wkj } 1≤k≤n Diese Tatsache setzen wir nun ein, um mit Hilfe eines modifizierten Algorithmus zur Matrixmultiplikation die Distanzen aller paarweise kürzesten Wege zu berechnen. Wir wollen demnach D(n−1) berechnen. Das ist offensichtlich durch n − 1 Matrixmultiplikationen möglich. In Iteration k wird dabei D(k−1) mit W multipliziert. Allerdings ist dieser Ansatz zu langsam. Die wichtige Idee ist daher nun, D(n−1) durch fortgesetztes Quadrieren bzgl. der Matrixmultiplikation zu berechnen: D(1) = W, D(2) = W 2 = W ∗ W, D(4) = W 4 = W 2 ∗ W 2 , ... D(2dlog n−1e) = D2dlog n−1e = Ddlog n−1e−1 ∗ Ddlog n−1e−1 Algorithmus 3.3 namens mmAPD zeigt nun, wie man durch fortgesetzte Aufrufe an eine Subroutine zur modifizierten Matrixmultiplikation die Distanzen der paarweise kürzesten Wege berechnen kann. Er nutzt dabei eine Matrixmultiplikation als Untermethode, siehe dazu Algorithmus 3.2 für eine mögliche (aber nicht schnelle) Implementierung. Algorithm 3.2 Matrixprodukt gemäß Schulmethode, allerdings für Halbring (min, +). 1: function MatMult(A, B) 2: Ausgabe: Matrixprodukt AB 3: for i ← 1 to n do 4: Cij ← ∞ 5: for k ← 1 to n do 6: Cij ← min{Cij , Aik + Bkj } 7: end for 8: end for 9: returnC 10: end function Momentan liegt die beste bekannte Laufzeit eines Algorithmus für Matrixmultiplikation bei O(n2.373 ) [Gal14]. Eine bessere untere Schranke als Ω(n2 ) ist nicht bekannt, so dass hier eine noch nicht geschlossene Lücke zwischen unterer und oberer Laufzeitschranke klafft. Die Laufzeit des Algorithmus mmAPD ist demnach O(mm(n) · log n), 40 3.2. Zweistufige Berechnung kürzester Wege Algorithm 3.3 Distanzberechnung durch fortgesetzte Matrixmultiplikation 1: function mmAPD(W ) 2: Ausgabe: Distanzmatrix 3: D(1) ← W 4: m←1 5: while m < n − 1 do 6: D(2m) ← MatMult(D(m) , D(m) ) 7: m ← 2m 8: end while 9: return D(m) 10: end function wobei mm(n) die Zeit ist, um zwei n × n Matrizen miteinander zu multiplizieren. Es gibt allerdings den Nachteil, dass die kürzesten Wege nicht gespeichert werden, auch nicht implizit. Dazu wären alle Matrizen D1 , . . . , Dm notwendig. Außerdem würde die Laufzeit auf O(mm(n) · n) ansteigen, was zur Zeit langsamer als Algorithmus 3.1 wäre. Zu beachten ist in diesem Kontext auch, dass die schnellen Algorithmen zur Matrixmultiplikation nur auf Ringen operieren können. Zwar lässt sich die Multiplikation boolescher Matrizen (zu denen Adjazenzmatrizen ungewichteter Graphen gehören) durch ganzzahlige Matrixmultiplikation realisieren. Dabei können allerdings ganzzahlige Matrizen entstehen, deren Einträge superlinear in n sind. In diesem Fall gelten die üblichen Annahmen für die Laufzeitschranken nicht mehr [MR95]. Daher lassen sich schnelle Algorithmen zur Matrixmultiplikation nicht auf allgemeine Graphen anwenden, was natürlich ein erheblicher Nachteil ist. 3.2. Zweistufige Berechnung kürzester Wege Ein grundlegendes Szenario für Graphenberechnungen sind Distanzanfragen zwischen zwei Knoten s und t. Solche Anfragen sind in vielen verschiedenen Anwendungsbereichen anzutreffen, beispielsweise in sozialen Netzwerken und bei Webseiten (Ähnlichkeiten finden, soziale Suche) [AIY13]. Zudem haben wir bereits in Kapitel 2 gesehen, dass Distanzen und deren Berechnungen ein wichtige Thema der Netzwerkanalyse sind. Betrachten wir ungewichtete Graphen. Hat man wenige Distanzanfragen, dann wird man diese mit Breitensuchen zwischen den jeweiligen Knotenpaaren lösen. Falls die Anfragen (fast) alle Knotenpaare betreffen, erscheint die Lösung des APSP- bzw. APDProblems sinnvoll. Aber was macht man, wenn sowohl die Zahl als auch die Knotenpaare der Anfragen im Vorfeld unbekannt sind? Insbesondere bei sehr großen Graphen mit Millionen von Knoten und Kanten? Akiba et al. [AIY13] präsentieren einen Ansatz, der ein komplexes Netzwerk (ungewichtet, ungerichtet, zusammenhängend) der oben genannten Größenordnung innerhalb weniger Minuten vorverarbeiten kann und dabei einen erträglichen Speicherverbrauch aufweist. Anfragen können dann im Mikrosekundenbereich exakt beantwortet werden. Diese schnelle Antwortzeit ist bei Anwendungen wichtig, die in Echtzeit mit dem Be- 41 3. Kürzeste Wege und globaler Zusammenhang nutzer interagieren. In solchen Szenarien wären einzelne Breitensuchen oder DijkstraAufrufe schlicht zu langsam (da im Sekundenbereich für große Graphen). Die Darstellung von Akiba et al.– an der wir uns orientieren – ist für ungewichtete und ungerichtete Graphen. Eine Erweiterung für gewichtete und gerichtete Graphen ist möglich; wir verzichten aus Gründen der einfacheren Darstellung hier aber darauf. Es sei der Vollständigkeit halber erwähnt, dass es für Straßennetzwerke eine Reihe von alternativen zweistufigen Verfahren gibt, die das Routing sehr effizient unterstützen [BDG+ 16] und für solche Eingaben noch besser sind. Die wesentliche Idee besteht darin, für jeden Knoten u ∈ V eine Distanzmarke (distance label ) L(u) zu erstellen. Die Distanzmarke L(u) ist dabei eine Menge von Paaren (w, dist(u, w)) für alle sogenannten Drehkreuze (hubs) w von u (Menge C(u)). Diese Drehkreuzmengen sollen nun so viele Knoten enthalten, dass für jedes Knotenpaar (s, t), die Distanzanfrage auf folgende Weise gelöst werden kann: Query(s, t, L) = min{dist(v, s) + dist(v, t) | (v, dist(v, s)) ∈ L(s), (v, dist(v, t)) ∈ L(t)}. v∈V Sollte es ein Paar (s, t) geben, für das L(s) und L(t) keinen gemeinsamen Knoten haben, dann definieren wir die Antwort der Anfrage als unendlich. Andernfalls bezeichnen wir L als (Distanz-gewahre) 2-Sprung-Überdeckung, englisch (distance-aware) 2-hop cover. Ähnlich zur Sprechweise im Datenbank-Bereich nennen wir die durch den Vorverarbeitungsschritt berechnete Überdeckung auch Index. In jeder Marke speichern wir dabei die Knoten aufsteigend, so dass eine Anfrage ähnlich wie ein Algorithmus zum Verschmelzen sortierter Listen in O(|L(s)| + |L(t)|) Zeit angewendet werden kann. Unser Ziel bei der Vorverarbeitung muss demnach sein, einen möglichst kleinen (im Sinne der Markengrößen) zu finden – und dies möglichst schnell. 3.2.1. Naiver Ansatz Wenn in jeder Marke L(u) alle Knoten w ∈ V \ {u} gespeichert werden, ist dies offensichtlich eine 2-Sprung-Überdeckung. Dies lässt sich natürlich erreichen, indem wir von jedem Knoten u ∈ V eine Breitensuche durchführen. Klar ist aber auch, dass dieser Ansatz sowohl hinsichtlich seiner Laufzeit als auch seines Speicherverbrauchs ineffizient ist. Um die eigentliche Methode einfacher erläutern zu können, starten wir trotzdem zunächst mit diesem naiven Ansatz. Die Grundidee ist also, von jedem Knoten v1 , . . . vn eine Breitensuche zu starten und dabei die Marken zu füllen. Gestartet wird mit L0 (u) ← ∅ ∀u ∈ V . In Runde k, während BF S(vk ), wird für einen Knoten u, der von vk erreicht wird, die Marke so aktualisiert: Lk (u) ← Lk−1 (u) ∪ {(vk , dG (vk , u))}. Wird u nicht von vk erreicht, behält man die alte Marke bei: Lk (u) ← Lk−1 (u). Nach n Runden muss sich nach Konstruktion ergeben: Query(s, t, Ln ) = min {distvs + distvt | (v, dist(v, s)) ∈ L(s), (v, dist(v, t)) ∈ L(t)} v∈Ln (s)∩Ln (t) (3.1) 42 3.2. Zweistufige Berechnung kürzester Wege Abbildung 3.1.: Ungerichteter Beispiel-Graph, der die Breitensuche vom Knoten 1 aus illustriert. Gerichtete Kanten geben lediglich den BFS-Ablauf wider. Quelle: Akiba et al. [AIY13, S. 353] = dist(s, t). (3.2) Beispiel 3.3. Betrachten wir den Graphen aus Abbildung 3.1. Einige der (partiellen) Distanzmarken sehen folgendermaßen aus: • Ln (1) = {(2, 2), (3, 2), (4, 1), . . . } • Ln (6) = {(1, 1), (2, 3), (3, 3), . . . } • Ln (11) = {(1, 2), (2, 2), (3, 1), . . . } Aus Ln (6) ∩ Ln (11) = {(1, 3), (2, 5), (3, 4), . . . } (man beachte die Überladung von ∩ durch Einbezug der Summe) ergibt sich dann beispielsweise: Query(6, 11, Ln ) = dist(6, 11) = 1 + 2 = 3 über das Drehkreuz 1. 3.2.2. Markieren mit Beschränkung der Suche Nun geht es darum, den obigen naiven Ansatz zu beschleunigen. Der einzige wesentliche Unterschied wird sein, dass wir anstatt normaler Breitensuche beschränkte Breitensuchen durchführen werden (Methode PrunedBFS. Wir starten wieder mit einem leeren Index L00 und erzeugen L0k aus L0k−1 während des k-ten PrunedBFS-Aufrufes, welcher von vk startet. Die wesentliche Änderung in PrunedBFS(vk ), siehe Algorithmus 3.4, ist folgende Abfrage während des Besuchs eines Knotens u: Falls Query(vk , u, L0k−1 ) kleiner oder 43 3. Kürzeste Wege und globaler Zusammenhang Algorithm 3.4 BFS mit Suchbeschränkung zur Bestimmung der Distanzmarken 1: function PrunedBFS(G = (V, E), vk , L0k−1 ) 2: Ausgabe: Distanzmarkierung L0k 3: Q ← {vk } 4: P [vk ] ← 0 5: P [v] ← ∞ ∀v ∈ V \ {vk } 6: L0k [v] ← L0k−1 [v] ∀v ∈ V 7: while Q is not empty do 8: u ← dequeue(Q) 9: if Query(vk , u, L0k−1 ) > P [u] then 10: L0k [u] ← L0k−1 [u] ∪ {(vk , P [vk ])} 11: for all w ∈ NG (u) mit P [w] = ∞ do 12: P [w] ← P [u] + 1 13: enqueue(Q, w) 14: end for 15: end if 16: end while 17: return L0k 18: end function Algorithm 3.5 Vorverarbeitung zur Konstruktion des Index L0 1: function Preprocess(G = (V, E)) 2: Ausgabe: Distanz-gewahre 2-Sprung-Überdeckung von G 3: L00 [v] ← ∅ ∀v ∈ G 4: for k = 1, 2, . . . , n do 5: L0k ← PrunedBFS(G, vk , L0k−1 ) 6: end for 7: return L0n 8: end function gleich der Schätzdistanz P [u] ist, dann kennen wir bereits einen Weg zwischen vk und u, der nicht länger ist. Somit wird vk nicht in die Marke von u eingetragen und u nicht in die BFS-Warteschlange eingefügt. Beispiel 3.4. Wenn man Algorithmus 3.5 auf den Graphen aus Beispiel 3.3 anwendet, erhält man Abbildung 3.2: Bleibt zu zeigen, dass Algorithmus 3.5 korrekt arbeitet und eine 2-Sprung-Überdeckung zurückgibt: Theorem 3.5. Für jedes 0 ≤ k ≤ n und jedes Paar von Knoten s und t gilt: Query(s, t, L0k ) = Query(s, t, Lk ). Beweis. Für den Induktionsanfang mit k = 0 gilt L00 = L0 und somit die Behauptung. Wir setzen nun voraus, dass die Behauptung für alle 0, 1, . . . , k − 1 gilt und wollen vom 44 3.2. Zweistufige Berechnung kürzester Wege Abbildung 3.2.: Ablauf der verschiedenen PrunedBFS-Aufrufe. Gelb: aktueller Wurzelknoten, blau: erreichter und dabei markierte Knoten, rot: erreichte und dabei beschränkte Knoten, grau: bereits verwendete Wurzelknoten, weiß: nicht erreichte Knoten. Quelle: Akiba et al. [AIY13, S. 353] . Fall k − 1 auf den Fall k schließen. Dabei verwenden wir auch die Notation δuv := dist(u, v). Seien dazu s und t ein Paar von Knoten, die sich oBdA erreichen. Sei j die kleinste Zahl derart, dass (vj , δvj ,s ) ∈ Lk (s), (vj , δvj ,t ) ∈ Lk (t) und δvj ,s + δvj ,t = Query(s, t, Lk ). Wir beweisen, dass (vj , δvj ,s ) und (vj , δvj ,t ) auch in L0k (s) bzw. L0k (t) enthalten sind. Daraus folgt direkt Query(s, t, L0k ) = Query(s, t, Lk ). Aus Symmetriegründen beweisen wir nur (vj , δvj ,s ) ∈ L0k (s). Für jedes i < j beweisen wir per Widerspruch, dass vi ∈ / PG (vj , s). Nehmen wir das Gegenteil an. Dann gilt: Query(s, t, Lk ) = distG (s, vj ) + distG (vj , t) (3.3) = distG (s, vi ) + distG (vi , vj ) + distG (vj , t) (3.4) ≥ distG (s, vi ) + distG (vi , t). (3.5) Weil dann (vi , distG (s, vi )) ∈ Lk (s) und (vi , distG (t, vi )) ∈ Lk (t) nach Annahme und Konstruktion gelten muss, haben wir den Widerspruch zur Minimalität von j. Daraus folgt vi ∈ / PG (vj , s) für alle i < j. Nun nutzen wir die obige Erkenntnis und beweisen, dass (vj , distG (vj , s)) ∈ L0k (s). Genau genommen beweisen wir das allgemeinere Ergebnis (vj , distG (vj , u)) ∈ L0k (u) für alle u ∈ PG (vj , s). Dabei gilt s ∈ PG (vj , s) offensichtlich. Nehmen wir oBdA an, dass nun PrunedBFS(vj ) durchgeführt wird, um L0j zu erstellen. Sei u ∈ PG (vj , s). Da PG (vj , u) ⊆ PG (vj , s) und vi ∈ / PG (vj , s) für alle i < j, gilt vi ∈ / PG (vj , u) für alle i < j. Anders ausgedrückt: Kein Knoten vi mit i < j ist Teil eines kürzesten Weges zwischen vj und u. Daraus folgt für Zeile 9 von Algorithmus 3.4: Query(vj , u, L0j−1 ) > distG (vj , u). Folglich besuchen wir alle Knoten u ∈ PG (vj , s) (weil die Suche nicht beschränkt wird), so dass gilt: (vj , distG (vj , u)) ∈ L0j (u) ⊆ L0k (u). Indem man im Theorem k = n wählt, lässt sich folgern, dass die exakten Distanzen berechnet werden: 45 3. Kürzeste Wege und globaler Zusammenhang Folgerung 3.6. Für jedes Paar von Knoten s und t gilt: Query(s, t, L0n ) = distG (s, t). L0 liefert somit nicht nur korrekte Ergebnisse auf Anfragen. Es lässt sich außerdem zeigen, dass wir mit L0 “keinen Speicher verschwenden”: Theorem 3.7. L0n ist minimal im folgenden Sinn: Für jeden Knoten v und jedes Paar (u, δuv ) ∈ L0n gibt es ein Paar von Knoten (s, t) derart, dass Query(s, t, L0n ) eine falsche Antwort liefert, falls wir (u, δuv ) aus L0n entfernen. Beweis. Präsenzübung. Einige Implementierungsaspekte seien noch kurz erwähnt, da sie für die Performance des Ansatzes durchaus wesentlich sind. Für Details verweisen wir allerdings aus Zeitgründen auf Akiba et al. [AIY13]. Zunächst ist die Reihenfolge der Abarbeitung der Knoten sehr wichtig. Neben einer zufälligen Reihenfolge experimentieren Akiba et al.auch mit einer approximierten Closeness-Rangfolge sowie einer absteigenden Sortierung nach Knotengrad. Die beiden letzten Strategien sind ungefähr gleich gut, die Sortierung nach Knotengrad aber schneller zu berechnen. 3.3. Das Phänomen der kleinen Welt und der Durchmesser Vielleicht haben Sie schon mal von der Redewendung “six degrees of separation” oder vom Phänomen der kleinen Welt gehört. Beide beziehen sich darauf, dass kürzeste Wege in sozialen Netzwerken erstaunlich wenige Kanten haben. Graphentheoretisch spricht man von einem kleinen Durchmesser: Definition 3.8. Für einen Graphen G = (V, E) definieren wir: eccG (v) = max {distG (v, w) : w ∈ V } (Exzentrizität von v) (3.6) rad(G) = min {eccG (v) : v ∈ V } (Radius von G) (3.7) diam(G) = max {eccG (v) : v ∈ V } (Durchmesser von G) (3.8) Der Durchmesser ist also der längste kürzeste Weg im Graphen. In komplexen Netzwerken ist dieser kurz, weil es meist einige hochgradige Drehkreuze gibt, über die man “weit springen” kann. Um diese lose Intuition zu schärfen, betrachten wir unser soziales Netzwerk SnappedIn und sein Freundschaftsnetzwerk. Betten wir dann das Freundschaftsnetzwerk gedanklich auf die Kugeloberfläche der Erde ein. Die meisten Verbindungen zwischen Freunden werden lokal und daher von kurzer Länge sein. Aber manche Verbindungen können auch sehr lang sein und selbst Kontinente überbrücken. Letzteres gilt insbesondere für Drehkreuze, die meist sehr weit ausstrahlen. Dieses Gedankenexperiment sollte verdeutlichen, warum gemäß “six degrees of separation” der Bekanntschaftsgraph der Menschen auf der Erde nur einen Durchmesser von sechs haben soll (Anmerkung: Das 46 3.3. Das Phänomen der kleinen Welt und der Durchmesser soziologische Experiment hatte einen Entwurfsfehler, der wohl zu einem zu kleinen Wert geführt hat. Andererseits wissen wir von sozialen Online-Netzwerken, dass bei ihnen der Durchmesser sogar noch kleiner ist. Die Online-Welt lässt uns näher zusammenrücken, zumindest graphentheoretisch). Wie berechnet man nun aber den Durchmesser? Ein naiver Ansatz, der zunächst alle paarweisen Abstände berechnet und darüber das Maximum bildet, ist offensichtlich zu langsam und wäre für SnappedIn mit hohen Nutzerzahlen nutzlos. Dies gälte auch für ungewichtete Graphen und einem n-maligen Aufruf einer Breitensuche – ähnlich wie bei Betweenness Centrality. Man kann sich zu Nutzen machen, dass der Durchmesser komplexer Netzwerke klein ist. Es gibt Heuristiken, die den exakten Durchmesser berechnen und dabei auf realen Instanzen typischerweise sehr schnell sind. Die nicht-exakte Komponente dieser Heuristiken besteht darin, dass die Laufzeit im schlechtesten Fall O(nm) Rechenschritte beträgt – und somit nicht besser ist als ein naiver Ansatz. Ein solches in der Praxis sehr erfolgreiches Verfahren von Crescenzi et al. [CGH+ 13a] für ungerichtete Graphen schauen wir uns nun genauer an. Sei nachfolgend G = (V, E) ein ungerichteter Graph und u ∈ V beliebig, aber fest. Beobachtung 3.9. Sei Tu der BFS-Baum von G mit Wurzel u. Dann ist die Höhe von Tu gleich ecc(u). Des weiteren können wir feststellen: Lemma 3.10. Für einen ungerichteten Graphen G = (V, E) und einen Knoten u ∈ V gilt: eccG (u) ≤ diam(G) ≤ 2 eccG (u). Der Beweis der beiden Schranken ist einfach und zur Übung empfohlen. Die Güte dieser Schranken in Lemma 3.10 hängt natürlich stark vom gewählten Knoten u ab. Aus den obigen Ergebnissen lässt sich bereits eine einfache algorithmische Methode ableiten. Wenn man von einem geeigneten Knoten u aus einen BFS-Baum aufbaut, lässt sich die Exzentrizität von u und somit eine obere Schranke für den Durchmesser leicht berechnen. Wiederholungen für andere Wurzelknoten können die Schranken potentiell verbessern. Letztlich ist dieses einfache Vorgehen noch nicht ausreichend für eine niedrige Laufzeit. Es wird insbesondere darauf ankommen, (i) die Wurzelknoten geeignet zu wählen und (ii) weitere Ergebnisse zu BFS-Bäumen und den Exzentrizitäten der enthaltenen Knoten herzuleiten und durch Annähern von unteren und oberen Schranken auszunutzen. Starten wir mit einigen Definitionen und Beobachtungen. Definition 3.11. • Sei Ni (u) die Menge der Knoten auf Ebene i von Tu . (Anders ausgedrückt ist Ni (u) die i-Sprung-Nachbarschaft von u.) • Sei F (u) := Necc(u) (u). (Die Knoten von F (u) bilden die unterste Ebene von Tu .) • Sei Bi (u) := maxz∈Ni (u) ecc(z) die maximale Exzentrizität der Knoten in Ni (u). 47 3. Kürzeste Wege und globaler Zusammenhang Beispiel 3.12. Siehe zunächst Tafel... Unser algorithmisches Ziel wird es sein, in Tu möglichst große Werte für ecc(x) für Knoten x ∈ V zu finden. Damit wird dann eine untere Schranke für den Durchmesser schrittweise verbessert. Beobachtung 3.13. Für jedes x, y ∈ V mit x ∈ Ni (u) oder y ∈ Ni (u) gilt: dist(x, y) ≤ Bi (u). Dies folgt direkt aus dist(x, y) ≤ min{ecc(x), ecc(y)} ≤ Bi (u). Lemma 3.14. Für alle 1 ≤ i, j ≤ ecc(u) und für alle x ∈ Ni (u), y ∈ Nj (u) gilt: dist(x, y) ≤ i + j ≤ 2 max{i, j}. Beweis. Dies folgt aus der Definition der Ni . Um von x nach y zu kommen, muss man schlimmstenfalls i Schritte in Tu bis zur Wurzel laufen und von dort j Schritte bis y. Interessant an Lemma 3.14 ist, dass wir daraus eine Abbruchbedingung für unseren späteren Algorithmus in Form des nachfolgenden Theorems herleiten können. Etwas weniger formal ausgedrückt, nehmen wir uns dabei eine Ebene i des Baumes Tu her, die nicht die unterste ist. Dann gilt für jeden Knoten x, der oberhalb von Ebene i liegt und für den ecc(x) > 2(i − 1) gilt, dass sein längster kürzester Weg zu einem Knoten yx führt, der tiefer als x im Baum liegt und zwar in Ebene i oder tiefer: Theorem 3.15. Seien 1 ≤ i < ecc(u) und 1 ≤ k < i beliebig. Für jedes x ∈ Ni−k (u) mit ecc(x) > 2(i − 1) existiert ein yx ∈ Nj (u) mit j ≥ i derart, dass dist(x, yx ) = ecc(x). Beweis. Seien i, k und x ∈ Ni−k (u) wie im Theorem. Aufgrund der Definition von ecc(·) muss es einen Knoten yx mit dist(x, yx ) = ecc(x) > 2(i − 1) geben. Falls yx ∈ Nj (u) mit j < i gälte, dann würde daraus und aus Lemma 3.14 folgen: dist(x, yx ) ≤ 2 max{i − k, j} ≤ 2 max{i − k, i − 1} = 2(i − 1). Aus diesem Widerspruch folgt yx ∈ Nj (u) mit j ≥ i. Satz 3.16. Sei y ∈ Ni.. ecc(u) (u) := Ni (u) ∪ Ni+1 (u) ∪ · · · ∪ Necc(u) ein Knoten mit maximaler Exzentrizität in dieser Menge und sei diese Exzentrizität ecc(y) > 2(i − 1). Dann gilt für alle x ∈ N1..i−1 (u) := N1 (u) ∪ N2 (u) ∪ · · · ∪ Ni−1 (u): ecc(x) ≤ ecc(y). Beweis. Sei x ∈ N1..i−1 beliebig und yx ∈ Ni.. ecc(u) ein Knoten mit ecc(x) = dist(x, y) – ein solcher Knoten existiert immer nach Theorem 3.15. Gemäß der Definition von Exzentrizität muss dann ecc(yx ) ≥ ecc(x) = dist(x, yx ) gelten. Nach Konstruktion gilt nun ecc(y) = Bi.. ecc(u) (u) und somit ecc(y) ≥ ecc(y 0 ) ∀y 0 ∈ Ni.. ecc(u) (u). Schließlich folgt daraus: ecc(y) ≥ ecc(x) ∀x ∈ N1..i−1 (u). 48 3.3. Das Phänomen der kleinen Welt und der Durchmesser Dieses Ergebnis zeigt uns, dass wir einen BFS-Baum Tu bottom up traversieren sollten, angefangen bei den Knoten von F (u). Auf jeder Ebene von Tu berechnen wir die Exzentrizitäten der Knoten dieser Ebene. Falls die maximale Exzentrizität c∗ größer als 2(i−1) ist, dann können wir uns die Abarbeitung der höheren Ebenen sparen, weil die Exzentrizitäten der darin enthaltenen Knoten nicht größer sein können als c∗ . Algorithmisch können wir somit für u grundsätzlich ableiten: 1. Initialisiere i ← ecc(u) und M ← Bi (u) 2. Falls M > 2(i − 1), dann gib M zurück. Andernfalls setze i ← i − 1, M ← max{M, Bi (u)} und wiederhole diesen Schritt. Beobachtung 3.17. Für den Durchmesser D von G und M := Bi (u) gilt: • M ≤ D, da M eine Exzentrizität angibt; • falls M ≤ 2(i − 1), dann D ≤ 2(i − 1). Indem wir unsere obigen Resultate kombinieren, erhalten wir schließlich Algorithmus 3.6. Die grau gefärbten Teile sind dabei nicht notwendig, erleichtern aber bei Bedarf die Analyse. Die Schleife von Algorithmus 3.6 über i beschreibt die Bottom-upAbarbeitung, wobei i die aktuelle Ebene des Baumes indiziert. Wichtig ist noch der Hinweis, dass Bi (u) durch BFS von jedem Knoten aus Ni (u) berechnet werden muss, wenn keine zusätzlichen Informationen genutzt werden. Der Rest funktioniert gemäß der obigen Überlegungen. Satz 3.18. Algorithmus 3.6 führt höchstens D/2 Iterationen durch. Beweis. Übungsaufgabe. Hinweis: Zeigen Sie zunächst, dass ub − lb in jeder Iteration um mindestens 2 gesenkt wird. Dazu bietet sich eine Schleifeninvariante an. Folgerung 3.19. Algorithmus 3.6 ruft BFS höchstens |ND/2.. ecc(u) (u)| mal auf. Wie bereits angedeutet, ist die Wahl des Startknotens u wichtig. Für die Details dazu und zu experimentellen Ergebnissen verweisen wir auf die Originalarbeit [CGH+ 13b]. Grob gesagt will man erreichen, dass ein möglichst flacher und oben dichter BFS-Baum entsteht. Mit etwas Glück erreicht man dies bereits, indem man den Knoten mit höchstem Knotengrad als u wählt. Etwas ausgeklügeltere Strategien basieren auf folgendem Ergebnis: Satz 3.20. Sie T ein Spannbaum von G. Dann gilt: diam(G) ≤ diam(T ). (3.9) Wenn v so gewählt wird, dass distT (u, v) = eccT (u) für einen Knoten u, dann gilt: diam(T ) = eccT (v). (3.10) Übung 3.21. Beweisen Sie Satz 3.20! 49 3. Kürzeste Wege und globaler Zusammenhang Algorithm 3.6 iFUB-Algorithmus 1: function iFUB(Graph G = (V, E), u ∈ V , untere Schranke l für Durchmesser D, Fehlerschranke k ∈ N0 ) 2: Ausgabe: Wert M mit D − M ≤ k 3: Berechne Tu 4: i ← ecc(u) . ecc(u) ist Tiefe von Tu 5: lb ← max{ecc(u), l) . lower bound lb 6: ub ← 2 ecc(u) . upper bound ub 7: while ub − lb > k do 8: Berechne Bi (u) . BFS von Knoten aus Ni (u) 9: if max{lb, Bi (u)} > 2(i − 1) then 10: return max{lb, Bi (u)} 11: else 12: lb ← max{lb, Bi (u)} 13: ub ← 2(i − 1) 14: i←i−1 . Ebene raufgehen in Tu 15: end if 16: end while 17: return lb 18: end function Mit bereits zwei BFS-Bäumen lässt sich wegen Satz 3.20 eine obere Schranke für D finden. Gleichzeitig kann eccG (v) als untere Schranke lb für Algorithmus 3.6 dienen. Diese Grundidee lässt sich weiter verfeinern, siehe Crescenzi et al. [CGH+ 13b] oder auch Magnien et al. [MLH08]. Umfangreiche Experimente von Crescenzi et al. [CGH+ 13b] zeigen, dass der exakte Durchmesser von Realwelt-Graphen oft mit einigen Dutzend oder wenigen Hundert BFS-Aufrufen in iFub bestimmt werden kann. Andererseits lassen sich natürlich auch Graphen konstruieren, für die der Algorithmus eine Laufzeit von O(nm) hat, da eine in n lineare Anzahl von Breitensuchen erforderlich ist. Übung 3.22. Berechnen Sie den Durchmesser von Graphen aus verschiedenen Klassen (Gitternetze aus Simulationen, Straßennetzwerke, Zitationsnetzwerke, Co-AutorenNetzwerke, Internet-Router-Graphen und Web-Graphen) mit NetworKit! Laden Sie diese Graphen aus dem Fundus der 10th DIMACS Implementation Challenge [BMS+ 14], zu finden unter http: // www. cc. gatech. edu/ dimacs10/ downloads. shtml . Arbeiten Sie jeweils mit der größten Zusammenhangskomponente. Diskutieren Sie Ihre Ergebnisse! Für welche Graphen zeigt sich das Phänomen der kleinen Welt? 3.4. Zusammenhangskomponenten Unser soziales Online-Netzwerk SnappedIn stellt im Profil jedes Benutzers dar, wie viele Personen grundsätzlich erreicht werden können, d. h. wie viele andere Benutzer durch 50 3.4. Zusammenhangskomponenten endlich viele Schritte im Freundschaftsgraphen besucht werden können. Graphentheoretisch sind dazu die Zusammenhangskomponenten (ZHK) und deren Größen zu bestimmen. Wir verweisen für die entsprechenden Definitionen von (starkem, schwachen) Zusammenhang auf Kaptitel 1. Hier betrachten wir nur einige Beispiel-Graphen zur Auffrischung (siehe Abbildung 3.3). Abbildung 3.3.: Beispielgraphen mit verschiedenen Zusammenhangseigenschaften. Starke Zusammenhangskomponenten (sZHK) in gerichteten Graphen sind demnach maximale Teilgraphen, in denen jeder Knoten jeden anderen erreicht und von allen anderen erreicht wird. Warum kann es wichtig sein, diese für SnappedIn oder einen Web-Graphen zu berechnen? Nun, ein Nutzer von SnappedIn hat sicherlich ein Interesse daran, möglichst viele andere Nutzer erreichen zu können bzw. von ihnen erreicht zu werden. Falls er sich in einer kleinen sZHK befindet, möchte er sich womöglich schnell “vergrößern”. Käme es da nicht gelegen, wenn SnappedIn ihm Personen als potentielle neue Freunde vorschlägt, die aus einer großen sZHK stammen? Weiterhin gibt es viele Graphenalgorithmen, die davon ausgehen, mit einem (stark) zusammenhängenden Graphen zu arbeiten. Wir haben bspw. in Kapitel 2.1.4 bereits festgestellt, dass man die Eigenvektor-Zentralität nur auf stark zusammenhängende Graphen anwenden sollte. Ein gängiger Weg um dieses Problem herum ist, dass man solche Algorithmen auf jede (s)ZHK getrennt anwendet. Komplexe Netzwerke zeichnen sich auch dadurch aus, dass sie zwar nicht unbedingt zusammenhängend sind, aber meist eine besonders große ZHK haben, die sogenannte giant component (GC). Bei Benchmark-Graphen kommt es daher nicht selten vor, dass nur die größte ZHK des Original-Datensatzes verwendet wird. Da diese ZHK oft deutlich mehr als 90% der Knoten beinhaltet, bleiben die mit der GC erzielten Ergebnisse auch für die Original-Daten typischerweise gültig (das hängt aber natürlich vom Algorithmus und den Daten ab). Wie berechnen wir nun aber (s)ZHK schnell – um z. B. festzustellen, ob ein Knoten 51 3. Kürzeste Wege und globaler Zusammenhang zur GC gehört oder nicht (in gewisser Hinsicht hat das auch etwas mit Zentralität zu tun, ist aber ein sehr schlecht unterscheidendes Zentralitätsmaß). Übung 3.23. (Präsenzübung) Angenommen, die Zeit, die man für die Multiplikation zweier Boolescher n × n-Matrizen (also Matrizen, deren Einträge entweder 0 oder 1 sind) benötigt, ist BM (n). Sei weiterhin die transitive Hülle eines gerichteten Graphen G = (V, E) definiert als G∗ = (V, E ∗ ) mit E ∗ = {{i, j} : es gibt einen Weg von i nach j in G}. Zeigen Sie, dass die transitive Hülle einer Booleschen n×n-Matrix in der Zeit O(BM (n)) berechnet werden kann. Tipp: Denken Sie an Zusammenhangskomponenten! 3.5. Weiterführende Literatur 52 4. Generierung von Graphen Die Erzeugung von Graphen anhand generativer Modelle spielt eine zentrale Rolle bei der Untersuchung komplexer Netzwerke. Dies hat eine Vielzahl von Gründen: • Realwelt-Daten können vertrauliche Informationen beinhalten, so dass es aus Datenschutz-Erwägungen vorteilhaft ist, mit ähnlichen synthetischen Daten zu arbeiten. • Bei der Algorithmen-Entwicklung benötigt man für kurze Tests mit ersten Prototypen kleine Testfälle. Auf der anderen Seite sollten Benchmark-Instanzen verschiedene Größen abdecken; insbesondere für Skalierbarkeits-Studien sind sogar sehr, sehr große Instanzen erforderlich. Der Vorteil von geeigneten Graphgeneratoren ist, dass sie Graphen mit (statistisch) ähnlicher Verbindungsstruktur, aber unterschiedlicher Größe erzeugen können. • Weiterhin können Generatoren bei der Weitergabe von Benchmark-Daten nützlich sein: Statt Giga- oder Terabytes von generierten Daten über schmalbandige Verbindungen senden zu müssen, reichen auch wenige Kilo- oder Megabytes an Code für den Generator und die geeigneten Parameter für die gewünschten Instanzen. • Schließlich sind generative Modelle auch aus theoretischer Sicht interessant, weil sie unser Verständnis dafür schärfen, wie sich reale Netzwerke über die Zeit entwickeln. Wir werden uns in diesem Kapitel mit einer Reihe verschiedener Modelle befassen. Algorithmen für die effiziente Erzeugung der zugehörigen Graphen steht dabei im Vordergrund. Aber wir werden auch verschiedene Eigenschaften der Modelle unter die Lupe nehmen und mit den Eigenschaften realer komplexer Netzwerke vergleichen. 4.1. Exakte Generierung von Gradfolgen Stellen Sie sich vor, Sie müssten einen Graphen aus Datenschutz-Gründen verfremden. Andererseits soll der verfremdete Graph wichtige Eigenschaften des Originals (weitgehend) erhalten. Wir haben im Verlauf der Vorlesung bereits mehrfach gesehen, dass die Gradverteilung eines Graphen eine wichtige Eigenschaft ist. Wie generieren wir daher (zunächst) Graphen, die eine vorgegebene Gradfolge, zum Beispiel eine mit Power-law Verteilung, erfüllen? Hier helfen uns Ergebnisse von Havel und Hakimi: Theorem 4.1 (Havel 1955; Hakimi 1962). Eine Folge d1 ≥ · · · ≥ dn ist genau dann Gradfolge eines schlichten ungerichteten Graphen, wenn auch die Folge d2 −1, . . . , dd1 +1 − 1, dd1 +2 , . . . , dn Gradfolge eines solchen Graphen ist. Beweis. (Präsenz)Übung. 53 4. Generierung von Graphen Algorithm 4.1 Algorithmus von Havel und Hakimi 1: function HavelHakimi(D = (d1 , . . . , dn )) 2: Eingabe: Realisierbare Gradfolge D 3: Ausgabe: Graph mit Gradfolge D 4: V ← {v1 , . . . , vn } 5: E←∅ 6: Li = (di , i) ∀i ∈ [n] 7: while G = (V, E) erfüllt D nicht do 8: Stell sicher, dass L absteigend gemäß der ersten Komponente sortiert ist 9: Verbinde L1 .second in E mit den nächsten L1 .f irst Knoten in L 10: Li .f irst ← Li .f irst − 1 ∀i ∈ {2, . . . , L1 .f irst + 1} 11: Entferne L1 aus L 12: end while 13: return G = (V, E) 14: end function Theorem 4.1 führt uns bereits in die Richtung eines Algorithmus. Dieser Weg wird vom folgenden Lemma weiter konkretisiert: Lemma 4.2. Zu einer Folge D = (d1 , . . . , dn ) mit d1 ≥ · · · ≥ dn sei GD die Menge aller schlichten ungerichteten Graphen mit Knoten {v1 , . . . , vn }, in denen vi den Grad di hat. Falls GD nicht leer ist, dann enthält GD einen Graphen mit N (v1 ) = {v2 , . . . , vd1 +1 }. Es gibt somit einen Graphen, der eine für uns günstige Nummerierung der Knoten hat. Daraus lässt sich nun Algorithmus 4.1 entwickeln. Beachten Sie, dass der angegebene Pseudocode recht abstrakt gehalten ist. Insbesondere ist es in Zeile 8 nicht nötig, explizit zu sortieren. In der Tat lässt sich der Algorithmus mit einer geeigneten Datenstruktur sehr effizient ausführen: Theorem 4.3. Der Algorithmus von Havel und Hakimi ist korrekt und lässt sich so implementieren, dass er Laufzeit O(m) hat. Beweis. Übung. Spätestens jetzt sollten wir uns dazu aber auch überlegen, welche Gradfolgen überhaupt realisierbar sind, d. h. ob man daraus tatsächlich einen gültigen Graphen konstruieren kann: Theorem 4.4 (Satz von Erdös und Gallai). Eine Partition d1 ≥ · · · ≥ dn > 0 einer natürlichen Zahl ist genau dann die Gradfolge eines schlichten ungerichteten Graphen, wenn n X di ≡ 0 mod 2 (4.1) i=1 und für alle j ∈ [n] gilt: j X i=1 54 di ≤ j(j − 1) + n X i=j+1 min{di , j}. (4.2) 4.1. Exakte Generierung von Gradfolgen Beweis. “⇒”: Sei G = (V, E) ein Graph mit der Gradfolge D. Dann können wir eine be:= V \ U betrachten. liebige Teilmenge U ⊆ V mit |U | =: j und ihr Komplement U P Mit einem Blick auf U sieht man ein, dass es nun mindestens v∈U (d(v) − (j − 1)) Kanten zwischen U und U geben muss. Denn jeder Knoten aus U kann mit höchstens j − 1 anderen Knoten aus U verbunden sein. Weiterhin zeigt uns ein P Blick auf die Knoten aus U , dass es höchstens v∈U min{d(v), j} Kanten zwischen U und U geben kann. Im Spezialfall U = {v1 , . . . , vj } liefert dieses Argument die notwendigerweise geltende Abschätzung. “⇐”: Der Rest des Beweises ist konstruktiv, d. h. wir geben ein Verfahren an, mit dem wir aus einer geeigneten Partition einen Graphen erstellen. Dazu definieren wir: Definition 4.5 (Teilrealisierung). Eine Teilrealisierung einer nichtaufsteigenden Folge (d1 , . . . , dn ) sei ein Graph mit Knotenmenge {v1 , . . . , vn } derart, dass deg(vi ) ≤ di für alle 1 ≤ i ≤ n. Wenn nun eine Folge (d1 , . . . , dn ) mit gerader Summe gegeben ist, die Ungleichung (4.2) erfüllt, dann konstruieren wir eine Realisierung durch sukzessive Teilrealisierungen. Initial habe dabei die Teilrealisierung n Knoten und keine Kanten. In einer Teilrealisierung ist der kritische Index r der größte Index, so dass deg(vi ) = di für alle 1 ≤ i < r. Initial gilt r = 1, falls die Liste nicht überall 0 ist und wir ohnehin fertig wären. Solange r ≤ n gilt, erhalten wir durch unser Vorgehen eine neue Teilrealisierung mit kleinerem Defizit dr − deg(vr ) am Knoten vr , ohne den Grad eines Knotens vi mit i < r zu ändern. Der Prozess stoppt erst, wenn die Teilrealisierung eine Realisierung von D ist. Sei S = {vr+1 , . . . , vn }. Wir halten die Bedingung aufrecht, dass S eine unabhängige Menge ist, was anfangs offensichtlich erfüllt ist. Wir schreiben vi ↔ vj , falls {vi , vj } ∈ E(G), sonst vi = vj . Fall 0: vr = vi für einen Knoten vi mit deg(vi ) < di : Füge Kante {vi , vr } hinzu. Fall 1: vr = vi für ein i mit i < r: Da deg(vi ) = di ≥ dr > deg(vr ), gibt es ein u ∈ N (vi ) \ N (vr ). (a) Falls dr − deg(vr ) ≥ 2, dann ersetze {u, vi } mit {u, vr } und {vi , vr }. (b) Falls P dr − deg(v P r ) = 1, dann gibt es einen Index k > r mit deg(vk ) < dk , weil ni=r di − deg(vi ) gerade ist. (b1) Falls vr = vk , wendet man Fall 0 an. (b2) Andernfalls ersetzt man {vr , vk } und {u, vi } durch {u, vr } und {vi , vr }. Fall 2: v1 , . . . , vr−1 ∈ N (vr ) und deg(vk ) 6= min{r, dk } für ein k > r: In einer Teilrealisierung gilt deg(vk ) ≤ dk . Da S unabhängig ist, gilt deg(vk ) ≤ r (|S| = r) und somit deg(vk ) < min{r, dk }. (a) Falls vk = vr gilt, führen wir Fall 0 aus. (b) Falls jedoch vk ↔ vr , dann gilt: Weil auch deg(vk ) < r, gibt es ein i < r mit vk = vi (vk hat maximalen Grad r − 1, wobei eine Kante zu vr geht und kann deshalb nicht mit allen Knoten v1 , . . . , vr−1 verbunden sein). Weil deg(vi ) > deg(vr ), existiert ein u ∈ N (vi ) \ N (vr ). Ersetze {u, vi } durch {u, vr } und {vi , vk }. 55 4. Generierung von Graphen Fall 3: v1 , . . . , vr−1 ∈ N (vr ) und vi = vj für ein i und j mit i < j < r: Übung 4.6! Falls keiner der Fälle 0 bis 3 gilt, sind v1 , . . . vr paarweise Pr adjazent und deg(vk ) = min{r, d } für alle k > r. Da S unabhängig ist, gilt k Pn Pr i=1 deg(vi ) = r(r − 1) + min{r, d }. Wegen Ungleichung (4.2) ist k k=r+1 i=1 di beschränkt durch die rechte Seite. Also haben wir das Defizit am Knoten vr beseitigt und setzen mit dem nächsten kritischen Index fort. Übung 4.6. Beweisen Sie Fall 3 von Theorem 4.4! 4.2. Erdős-Rényi-Modell Bei unserer Betrachtung von Zufallsgraphen starten wir mit einem sehr gut untersuchten, da vergleichsweise altem Modell. Genau genommen handelt es sich um zwei Modelle, die häufig (wenn auch nicht ganz korrekt) als Erdős-Rényi -Modelle bezeichnet werden. Beide Modelle generieren schlichte, ungerichtete, statische Graphen. • Ein Graph des Modells G(n, m) hat n Knoten und m zufällig, unabhängig und gleichverteilt gezogene Kanten zwischen Knotenpaaren. Eine andere Sichtweise ist, dass man einen Graphen zufällig und gleichverteilt aus der Menge aller Graphen mit n Knoten und m Kanten zieht. • Ein Graph des Modells G(n, p) besteht aus n Knoten. p gibt für jede mögliche Kante zwischen einem Knotenpaar die Wahrscheinlichkeit an, ob diese Kante existiert oder nicht. G(n, p) ist häufig leichter zu analysieren als G(n, m). Abbildung 4.1.: Erdős-Rényi-Graphen des Modells G(20, p) mit unterschiedlichen Wahrscheinlichkeiten p. Quelle: http://epress.anu.edu.au/cs/ chap5Newth-final-5.jpg. 56 4.2. Erdős-Rényi-Modell 4.2.1. Grundlegende Eigenschaften von G(n, p)-Graphen Betrachten wir zunächst einige grundlegende Eigenschaften des G(n, p)-Modells. Man kann sich dazu den Prozess der Erzeugung eines solchen Graphen als n2 -faches BernoulliExperiment mit Erfolgswahrscheinlichkeit p vorstellen. Dabei wandert man das obere Dreieck der Adjazenzmatrix des Graphen entlang und führt bei jedem Eintrag ein solches Bernoulli-Experiment durch. Im Erfolgsfall wird eine 1 eingetragen für die erzeugte Kante, sonst eine 0. In Übung 4.8 werden wir ausarbeiten, wie die Generierung effizienter (O(m) statt O(n2 )) durchgeführt werden kann. • Die Zahl der erwarteten Kanten ist E[m] = n 2 · p. • Der erwartete Durchschnittsgrad des Graphen ist 2m/n = (n − 1)p. n • Jeder Graph G mit m Kanten tritt mit Wahrscheinlichkeit P(G) = pm (1 − p)( 2 )−m auf. Um dies einzusehen, muss man sich nur den oben erwähnten Erzeugungsprozess vor Augen führen: m mal trat Erfolg auf, in den übrigen Versuchen Misserfolg. Grundsätzlich können wir feststellen (ohne dies im Detail auszuführen), dass viele Eigenschaften des Modells um den Mittelwert konzentriert sind. Dies gilt auch für die Gradverteilung, die wir nun genauer betrachten. Die Wahrscheinlichkeit, zu bestimmten k anderen Knoten verbunden zu sein und zu den anderen n − 1 − k nicht, ergibt sich zu pk (1 − p)n−1−k . Die k anderen Knoten, zu denen eine Verbindung besteht, können auf n−1 Arten gewählt werden. Also ist die Wahrscheinlichkeit dass ein Knoten zu genau k k anderen adjazent ist: n−1 k pk = p (1 − p)n−1−k , (4.3) k was eine Binomialverteilung darstellt. Diese unterscheidet sich sehr deutlich von den endlastigen Verteilungen, die wir im Kapitel 2 als typische Gradverteilung vieler realer Netzwerktypen kennengelernt haben. Zudem hatten wir bereits festgestellt, dass reale Netzwerke häufig einen konstanten Durchschnittsgrad c aufweisen – zumindest wächst er typischerweise nicht mit n. Das bedeutetet wiederum, dass p = c/(n − 1) bei großem n sehr klein wird für konstantes k n−1−k c. Unter der Annahme p → 0 bei n → ∞ wird die Gradverteilung n−1 k p (1 − p) poissonsch: ln((1 − p)n−1−k ) = (n − 1 − k) ln(1 − ≈ −(n − 1 − k) c ) n−1 c ≈ −c n−1 Demnach gilt (1 − p)n−1−k = e−c für n → ∞ sowie (ebenfalls für n → ∞) n−1 (n − 1)! (n − 1)k = ≈ . k (n − 1 − k)!k! k! 57 4. Generierung von Graphen Daraus können wir schließlich folgern: (n − 1)k k −c (n − 1)k pk ≈ p e = k! k! c n−1 k e−c = e−c · ck . k! Zwar gilt dieses Ergebnis nur unter unseren getätigten Annahmen. Aber wir hatten ja bereits argumentiert, dass diese durchaus realistisch sind – in dem Sinn, dass sie für viele reale Netzwerktypen gelten. In Kapitel 2 hatten wir auch festgestellt, dass zumindest soziale Netzwerke einen hohen globalen Cluster-Koeffizienten C aufweisen. Auch dies gilt nicht für Erdős-RényiGraphen, denn C gibt die Wahrscheinlichkeit an, dass zwei Nachbarn eines Knotens auch benachbart sind. Zwischen jedem Knotenpaar existiert aber unabhängig vom konkreten Paar eine Kante mit Wahrscheinlichkeit p = c/(n − 1). Daraus folgt E[C] = c/(n − 1), was für große n und konstantes c gegen 0 geht. Insofern muss man konstatieren, dass selbst so grundlegende Eigenschaften wie Gradverteilung und Clusterkoeffizient stark von vielen realen Eingaben abweichen. Nichtsdestotrotz sind Erdős-Rényi-Graphen ein interessantes Forschungsobjekt; viele grundlegende Ergebnisse zu Netzwerkeigenschaften wurden zuerst für Erdős-Rényi-Graphen gezeigt. 4.2.2. Phasenübergang bzgl. der Zusammenhangskomponenten In Kapitel 3.4 hatten wir festgestellt, dass komplexe Netzwerke oft eine einzige sehr große Zusammenhangskomponente besitzen. Da ist die Frage nur natürlich, wie sich diese Eigenschaft bei Erdős-Rényi-Graphen darstellt, wenn man p variiert. Klar ist, dass wir bei p = 0 n isolierte Knoten, also Zusammenhangskomponenten der Größe 1 erhalten. Bei p = 1 wiederum erhalten wir einen vollständigen Graphen und somit eine Zusammenhangskomponente der Größe n. Hier zeigt sich ein ganz wesentlicher qualitativer Unterschied: in beiden Fällen ergeben sich die Extreme, einerseits konstant, andererseits linear von n abhängig. Komplexe Systeme zeichnen sich oft durch nichtlineares Verhalten aus. Dies äußert sich beispielsweise darin, dass kleine Parameteränderungen sehr große Effekte haben. Dieses Phänomen bezeichnet man auch als Phasenübergang, d. h. das System geht ruckartig von einer Phase (= Zustand) in eine andere über. Wir werden dieses Phänomen für ErdősRényi-Graphen und die Größe ihrer Zusammenhangskomponente betrachten, da dies ein sehr zentrales Resultat in diesem Bereich darstellt: Theorem 4.7 (Erdős-Rényi). Die Funktion t(n) = ln n/n ist eine Grenzfunktion für den Zusammenhang in einem Zufallsgraphen der Art G(n, t(n)). In anderen Worten bedeutet das Theorem, dass kleinere Wahrscheinlichkeiten als t(n) fast immer zu unzusammenhängenden Graphen führen, wohingegen größere Wahrscheinlichkeiten fast immer eine große Zusammenhangskomponente ergeben. 58 4.2. Erdős-Rényi-Modell Vor dem für dieses Skript vergleichsweise langen Beweis, der auf Jacksons Darstellung [Jac08, Kapitel 4.2] (adaptiert von Bollobás) beruht, geben wir eine grobe Übersicht. Zunächst beruht der Beweis auf der Tatsache, dass die Grenzfunktion t(n) nicht nur für den Zusammenhang gilt, sondern auch für die Existenz isolierter Knoten. Um dies einzusehen, stellen wir fest, dass die Wahrscheinlichkeit, dass ein bestimmter Knoten isoliert ist, (1−p)n−1 ist. Für große n ist dies ungefähr (1−p)n . Liegt p nahe am Grenzwert ln n/n, so konvergiert p/n ≈ ln n/n2 gegen 0. Daraus ergibt sich für die Wahrscheinlichkeit, dass ein bestimmter Knoten isoliert ist, (1 − p)n = e−np beträgt, denn limn→∞ (1 − na )n = e−a . Am Grenzwert ergibt sich e−n ln n n = 1/n (4.4) für diese Wahrscheinlichkeit. Im ersten Beweisteil wählen wir p dann kleiner als den Grenzwert. Dort zeigen wir, dass die Wahrscheinlichkeit für einen isolierten Knoten gegen 1 strebt. Im zweiten Beweisteil wählen wir p größer. Dort zeigen wir dann, dass es mit hoher Wahrscheinlichkeit keine Zusammenhangskomponenten mit weniger als n/2 Knoten gibt. Beweis. (von Theorem 4.7 Wir zeigen zunächst: Falls p/(ln n/n) → 0, dann geht die Wahrscheinlichkeit für die Existenz isolierter Knoten gegen 1. Nach unserer Vorüberlegung wissen wir bereits: P(gegebener Knoten ist isoliert) → e−pn . Um die Abhängigkeit von p von n auszudrücken, schreiben wir nachfolgend p := p(n) = ln n − f (n) , n wobei in diesem Beweisteil f (n) → ∞ und f (n) < ln n gelten. Dann wird aus e−pn (durch die Wahl von p) ef (n) , n woraus folgt, dass die erwartete Anzahl isolierter Knoten ef (n) gegen ∞ strebt. Dass die Zahl isolierter Knoten divergiert, beweist allerdings noch nicht, dass P(es gibt einen isolierten Knoten) gegen 1 strebt. Um dies zu zeigen, sei X die Zahl der isolierten Knoten und eine Zufallsvariable mit Mittelwert µ und Streuung σ. Unsere Behauptung gilt, wenn für die Varianz von X, E[X 2 ] − E[X]2 , gilt: E[X 2 ] − E[X]2 ≤ 2µ = 2E[X]. (4.5) Insbesondere gilt dann wegen der Chebyshev-Ungleichung (Definition A.7): P(X < √ µ − r 2µ) < 1/r2 . Dies folgt aus der Tatsache, dass σ die Wurzel der Varianz ist. Vor allem folgt daraus aber wiederum wegen µ → ∞, dass die Wahrscheinlichkeit für ein divergierendes X gegen 1 strebt. Um die obere Schranke (4.5) zu zeigen, machen wir uns zunächst klar, dass E(X(X−1)) die erwartete Zahl geordneter Paare von isolierten Knoten ist. Diese ist nach Vorüberlegung n(n − 1)(1 − p)2n−3 , weil jedes Knotenpaar von allen anderen Knoten isoliert ist, falls 59 4. Generierung von Graphen keine der 2(n − 2) möglichen Kanten zu den übrigen Knoten vorhanden ist sowie auch nicht die Kante zwischen den beiden betrachteten Knoten. Somit gilt: E[X 2 ] − E[X]2 = E[X 2 − X] + E[X] − E[X]2 = n(n − 1)(1 − p) 2n−3 (4.6) 2 + E[X] − E[X] = n(n − 1)(1 − p)2n−3 + E[X] − n2 (1 − p)2n−2 2 ≤ E[X] + pn (1 − p) 2n−3 (4.7) (4.8) (4.9) (4.4) = E[X](1 + p(1 − p)) (4.10) ≤ 2E[X]. (4.11) Um zu zeigen, dass t(n) = ln n/n die Grenzfunktion für die Existenz isolierter Knoten ist, müssen wir noch beweisen, dass die Wahrscheinlichkeit isolierter Knoten gegen 0 geht, wenn p(n)/t(n) → ∞. Es reicht dabei, dies für p(n) = ln n + f (n) mit f (n) → ∞ (aber f (n)/n → 0) zu zeigen. Ähnlich wie zuvor schließen wir, dass die erwartete Anzahl isolierter Knoten gegen e−f (n) und somit nun gegen 0 geht. Die Wahrscheinlichkeit, dass X mindestens 1 ist, muss dann auch gegen 0 gehen für E[X] → 0. Um den Beweis abzuschließen, müssen wir noch zeigen, dass auch die Wahrscheinlichkeit für Zusammenhangskomponenten der Größen 2 bis n/2 gegen 0 geht für p(n)/t(n) → (n) , ∞. Sei dazu X k die Zahl der Komponenten mit Größe k. Sei weiterhin p(n) = ln n+f n Pn/2 k wobei f (n) → ∞ und f (n)/n → 0. Es genügt zu zeigen, dass E[ k=2 X ] → 0: E[ n/2 X k=2 n/2 X n (1 − p)k(n−k) (Sei nun n := dn3/4 e.) X ]≤ k k (4.12) k=2 n/2 n X X n n k(n−k) = (1 − p)k(n−k) (1 − p) + k k (4.13) ≤ (4.14) k=2 k=n+1 n X k=2 ≤ n X e n/2 X en k −knp/2 en k −knp k2 p e e + e k k k=n+1 k(1−f (n)) −k 2k2 ln n/n k e k=2 n/2 X en k −knp/2 + e k (4.15) k=n+1 3/4 /5 ≤ 3e−f (n) + n−n →0 (4.16) In der nachfolgenden Tabelle 4.1 ist noch einmal in der Übersicht dargestellt, welchen Einfluss die Wahl der Kantenwahrscheinlichkeit p auf die Zahl der Zusammenhangskomponenten hat. 60 4.3. Barabási-Albert-Modell Tabelle 4.1.: Einfluss von p bzw. np auf die erwartete Zahl und Größe der Zusammenhangskomponenten eines Graphen des G(n, p)-Modells np < 1 np = 1 np → c > 1 np > (1 + ε) ln n fast nie ZHK, die größer als O(log n) ist fast immer eine ZHK, die größer als O(log n) ist fast immer eine eindeutige riesige ZHK, keine andere ZHK enthält mehr als O(log n) Knoten mhW fast immer zusammenhängend (ε > 0) 4.2.3. Effiziente Generierung von Erdős-Rényi-Graphen Übung 4.8. (Präsenzübung) Entwickeln Sie einen Algorithmus mit Laufzeit O(m) zur Generierung von Graphen des G(n, p)-Modells! Den zugehörigen NetworKit-Quellcode finden Sie im cpp-Verzeichnis generators; die Klasse heißt ErdosRenyiGenerator. 4.3. Barabási-Albert-Modell Übung 4.9. Entwerfen Sie einen effizienten sequentiellen Algorithmus zur Generierung von Barabási-Albert-Graphen mit n Knoten und Knotengrad c eines “neuen” Knotens! Beschreiben Sie die Idee, setzen diese in Pseudocode um und argumentieren Sie dann, dass die Laufzeit O(cn) = O(m) eingehalten wird! Schauen Sie erst danach in den NetworKit-Quellcode. Tipp: Überlegen Sie sich zunächst, wie Sie auf einfache Weise einen Knoten derart zufällig ziehen können, dass die Wahrscheinlichkeit vom Knotengrad abhängt. Den zugehörigen NetworKit-Quellcode finden Sie im cpp-Verzeichnis generators; die Klasse heißt BarabasiAlbertGenerator. 4.4. Chung-Lu-Modell Den zugehörigen NetworKit-Quellcode finden Sie im cpp-Verzeichnis generators; die Klasse heißt ChungLuGenerator. 4.5. Rekursives Matrix-Modell (R-MAT) Den zugehörigen NetworKit-Quellcode finden Sie im cpp-Verzeichnis generators; die Klasse heißt RmatGenerator. 4.6. Zufallsgraphen mit hyperbolischer Geometrie (RHG) Den zugehörigen NetworKit-Quellcode finden Sie im cpp-Verzeichnis generators; die Klasse heißt HyperbolicGenerator. 61 4. Generierung von Graphen Übung 4.10. Generieren Sie Graphen gleicher Größe (sei n = 4096) gemäß der Modelle R-MAT, Barabási-Albert, Erdős-Rényiund RHG (hyperbolische Graphen)! Diskutieren Sie die resultierenden Graphen: • Wenden Sie das Profiling-Tool von NetworKit an, um statistische Übersichten zu den Graphen zu erhalten. • Um zufällige Verzerrungen auszugleichen, sollten Sie die Generierung mehrmals wiederholen. Vergleichen Sie dann die Profile der verschiedenen Modelle! • Was fällt besonders auf ? Wo werden asymptotische Aussagen bestätigt, wo nicht? 4.7. LFR und ReCon Mit Hilfe eines LFR-Generators kann man Graphen erzeugen, die eine festgelegte Community-Struktur haben. Dies wird insbesondere im Kontext des nachfolgenden Kapitels 5 wichtig, um die dort vorgestellten Clustering-Algorithmen zu testen. LFR steht für die drei Autoren Lancichinetti, Fortunato und Radicchi [LFR08]. Durch einige Erweiterungen von LFR lässt sich ein Generator erzeugen, der ein bestehendes Netzwerk Go hernimmt und ein größeres neues Gn erzeugt, das statistisch gesehen wesentliche Eigenschaften von Go erhält – abgesehen natürlich von Eigenschaften, die direkt von der Größe abhängen. Insbesondere handelt es sich um Verteilungen von Maßen, die wir im Rahmen der Vorlesung bereits kennengelernt haben. Auf diese Weise lassen sich aussagekräftige Benchmark-Graphen von fast beliebiger Größe erstellen – wichtig für Skalierungstests. Eine detailliertere Beschreibung dieses noch recht neuen Generators namens ReCon muss aus Zeitgründen leider entfallen; wir verweisen auf die Originalarbeit von Staudt et al. [SHS+ 16]. Den zugehörigen NetworKit-Quellcode finden Sie im cpp-Verzeichnis generators; die Klasse heißt für beide Einsatzzwecke (d. h. auch für ReCon) LFRGenerator. 4.8. Weiterführende Literatur 62 5. Clusteranalyse Irregulär strukturierte Daten, die sich als Graph bzw. Netzwerk darstellen lassen, finden sich in immer mehr Anwendungen. Die Datenmengen, die sich dabei ergeben, sind in den letzten Jahren rasant angestiegen. Es stellt sich somit aus algorithmischer Sicht die Frage, wie man mit diesen sehr großen Datenmengen umgehen kann. Ein Ansatz kann dabei sein, einen teuren Algorithmus nicht auf den ganzen Graphen anzuwenden, sondern nur auf relevante Teile. Was dabei ,,relevant” ist, hängt natürlich vom konkreten Problem bzw. der konkreten Anwendung ab. Aber zumindest kann es sinnvoll sein, in einem Durchgang Teilgraphen zu betrachten, in denen sich die Knoten in gewisser Weise ähnlich sind. Diese Ähnlichkeit kann etwa darin bestehen, dass diese Knoten einen hohen Grad an Zusammenhang aufweisen (was wir gleich noch formalisieren müssen). Zugleich kann es für einen Analysten auch aus ganz anderen Gründen interessant sein zu erfahren, wie ein Netzwerk in natürliche Gruppen zerfällt. Im sozialen Kontext lässt sich daraus mglw. ableiten, welche Effekte bei der Bildung von Gruppen eine wichtige Rolle spielen. Aus der sozialen Netzwerkanalyse hat sich daher der Begriff community detection für das Graphclustering entwickelt. Teilweise unterscheidet die Literatur die beiden Begriffe – je nach wissenschaftlichem Feld. Wir verwenden die Begriffe hier synonym. Was die beste oder wenigstens eine gute Clusterung ist, kann sich deutlich von Problem zu Problem unterscheiden. Als Algorithmiker wollen wir aber natürlich Methoden entwickeln, die vielseitig und ohne großes Zutun eines Benutzers verwendbar sind. Grundsätzlich versucht man bei der Clusteranalyse zu erreichen, dass die Objekte desselben Clusters sich ähnlich sind und Objekte verschiedener Cluster sich unähnlich sind. Ein vielfach genutztes Prinzip für das Clustern von Graphen ist daher das Paradigma, dass Cluster intern dicht sein und nach außen nur wenige Verbindungen haben sollen (engl. intra-dense vs inter-sparse paradigm). Somit sollen Clustergrenzen möglichst wenige Kanten schneiden. Anders ausgedrückt sollen zwischen Knoten desselben Clusters viele Wege kurzer Länge verlaufen, zwischen Knoten verschiedener Cluster aber nur wenige solcher Wege. Um auf algorithmischem Wege zu einer guten Clusterung zu kommen, formalisiert man die obige abstrakte Vorstellung mit einer Zielfunktion. Dabei ist es auch wichtig zu beachten, dass die Cluster nicht völlig unterschiedliche Größe haben. Denn wenn man nur die Schnittgröße (also die Zahl der Kanten zwischen verschiedenen Clustern) ohne jegliches Balancekriterium berücksichtigen würde, wäre das Abschneiden der Knoten mit geringstem Grad immer optimal. Manche Zielfunktionen nehmen daher ein Balancekriterium explizit auf (wie etwa der normalisierte Schnitt), andere implizit. 63 5. Clusteranalyse 5.1. Zielfunktion Modularität Wir betrachten hier nur disjunkte Cluster, suchen also eine Partition der Knotenmenge V gemäß der obigen Überlegungen. Um diese Überlegungen zu formalisieren, führen wir die Zielfunktion Modularität (engl. modularity) ein. Sie ist im Bereich der sozialen Netzwerkanalyse sehr populär und hat auch in vielen weiteren Anwendungen breiten Einsatz gefunden: Definition 5.1. Sei G = (V, E) ein Graph, dieser habe eine Clusterung C, also eine Partition der Knotenmenge V . Die Modularität q von C auf G ist definiert als: P 2 X |E(C)| v∈C deg(v) q(G, C) := . (5.1) − m 2m C∈C Bei der obigen Definition bezeichnet E(C) die Menge der Intra-Cluster-Kanten des Clusters C. Modularität lässt sich alternativ auch so schreiben (der Nachweis der Äquivalenz beider Ausdrücke sei als Übungsaufgabe empfohlen): 1 X deg(i) deg(j) q(G, C) := Aij − δ(c(i), c(j)). (5.2) 2m 2m ij Der Cluster eines Knotens i wird dabei mit c(i) bezeichnet. Außerdem stellt δ(·, ·) das sogenannte Kronecker-Delta dar, welches genau dann 1 ist, wenn beide Parameter gleich sind und sonst 0. Modularität muss maximiert werden. Die Leserin kann sich leicht überzeugen, dass der Wert 1 eine obere Schranke darstellt. Werte um 0 weisen auf eine fehlende Clusterstruktur hin. Das theoretische Minimum liegt nach Bisseling und Fagginger Auer [AB12] bei - 12 . Es ergibt sich nun folgendes Clustering-Problem: Problem 5.2. Graph Clustering gemäß Modularität) • Eingabe: Graph G = (V, E) • Ausgabe: Clusterung C (eine Partition von V ), die q(G, C) maximiert Modularität gehört zu den Zielfunktionen, die implizit balancieren. Die Idee hinter Modularität ist, den Anteil der Intra-Cluster-Kanten (diesen Ausdruck nennt man englisch auch coverage) mit dem erwarteten Anteil dieser Größe in einem Zufallsgraphen mit gleicher Gradfolge zu vergleichen. Eine Clusterung, die aus nur einem Cluster besteht, hat dann Modularität 0, was ausdrückt, dass keine nennenswerte Clusterstruktur vorliegt. Dabei hat der Zufallsgraph des Nullmodells dieselbe Gradverteilung wie der ursprüngliche Graph. Satz 5.3. Modularität vergleicht die tatsächliche coverage und ihren Erwartungswert für jeden Cluster. Beweis. Dass der Teil links des Minuszeichens der coverage entspricht, ist in Formel (5.1) offensichtlich. Der Erwartungswert für den rechten Teil lässt sich wiederum leichter aus 64 5.1. Zielfunktion Modularität Formel (5.2) herleiten: Betrachten wir dazu eine beliebige Kante mit dem Ziel, zunächst die Zahl der erwarteten Intra-Cluster-Kanten herzuleiten. Starte diese Kante am Knoten i. Wenn wir für diese Kante einen zufälligen anderen Endpunkt suchen, dann wird in unserem Nullmodell des Zufallsgraphen mit Wahrscheinlichkeit deg(j) 2m der Knoten j gewählt, weil die m Kanten von G insgesamt 2m Endpunkte haben. Wenn wir dieses Prozedere der Neuverdrahtung für alle Kanten des Knoten i durchführen, multipliziert man den Ausdruck noch mit deg(i). Wir erhalten also für alle P P Halbkanten: i deg(i) j deg(j) 2m . Den Erwartungswert für den Anteil der Intra-Cluster-Kanten erhalten wir, indem wir für jedes geordnete Knotenpaar den Beitrag wie oben angegeben verwenden sowie eine Indikator-Variable, ob sie innerhalb eines Clusters verläuft. Letzteres erledigt der Ausdruck δ(c(i), c(j)). Um jede Kante wiederum nur einmal zu zählen, brauchen wir noch die Normalisierung 12 vor der Summe. Um coverage, also den Anteil der IntraCluster-Kanten, zu erhalten, teilen wir schließlich noch durch m. Fast alle (interessanten) Zielfunktionen sind als Entscheidungsprobleme N P-vollständig, dies gilt für Modularität sogar im strengen Sinn: Problem 5.4. (Modularity) • Gegeben: Graph G und eine Zahl K • Frage: Gibt es eine Clusterung C von G, für die q(C) ≥ K gilt? Theorem 5.5. Das Problem Modularity ist streng N P-vollständig. Der Beweis erfolgt nach Brandes et al. [BDG+ 08] durch Reduktion von 3-Partition auf Modularity. Problem 5.6. (3-Partition) • Gegeben: 3k positive ganze Zahlen a1 , . . . , a3k derart, dass ai ≤ b/2 für eine ganze Zahl b und alle i = 1, . . . , 3k P3k i=1 ai = kb und b/4 ≤ • Frage: Gibt es eine Partition dieser Zahlen in k Mengen derart, dass die Zahlen in jeder Menge in der Summe b ergeben? Für den Beweis benötigen wir einige Lemmas, die wir aus Zeitgründen nicht beweisen werden. Die Transformation für die geplante Reduktion im Beweis geschieht folgendermaßen: Sei eine Instanz A für 3-Partition gegeben. Daraus konstruieren wir einen Graphen P a . Für jedes Element G(A) mit k Cliquen H1 , . . . , Hk der jeweiligen Größe a = 3k i i=1 ai ∈ A fügen wir einen sogenannten Element-Knoten ein. Diesen verbinden wir mit ai Knoten in jeder der k Cliquen derart, dass jeder Cliquen-Knoten zu genau einem Element-Knoten verbunden ist. Damit hat jeder Cliquen-Knoten Grad a. Der ElementKnoten zum Element ai hat wiederum Grad kai . Die Zahl der Kanten in G(A) ist dann m = k/2 · a(a + 1), denn: (i) wir haben k Cliquen mit jeweils a Knoten mit Grad a, P 2 somit ka2 Kanten; (ii) bei den Elementknoten ergeben sich i kai = ak Kanten, was noch durch zwei geteilt werden muss, um die Kanten nicht doppelt zu zählen. 65 5. Clusteranalyse Lemma 5.7. In einer Clusterung von G(A) mit maximaler Modularität wird keine der Cliquen H1 , . . . , Hk geteilt. Lemma 5.8. In einer Clusterung von G(A) mit maximaler Modularität enthält jeder Cluster höchstens eine der Cliquen H1 , . . . , Hk . Lemma 5.9. In einer Clusterung von G(A) mit maximaler Modularität besteht kein Cluster ausschließlich aus Element-Knoten. Aus den Lemmas folgt, dass für Graphen der Form G(A) die Clusterung mit maximaler Modularität aus genau k Clustern besteht, die jeweils genau eine Clique beinhalten. Jeder Element-Knoten gehört zudem zu genau einem Clique-Cluster. Beweis. (von Theorem 5.5) Für eine gegebene Clusterung C von G(A) lässt sich in polynomieller Zeit prüfen, ob q(C) ≥ K(A) gilt. Also ist Modularity ∈ N P. Wir beweisen nun die Reduktion 3-Partition ≤ Modularity. Dazu transformieren wir wie oben beschrieben eine Instanz A = {a1 , . . . , a3k von 3-Partition in eine Instanz (G(A), K(A)) von Modularity. Zur Bestimmung von K(A) betrachten wir eine Clusterung in G(A) mit genau k Cliquen-Clustern. Jede solche Clusterung hat genau (k − 1)a Inter-Cluster-Kanten, denn von jedem Element-Knoten gehen kai Kanten aus, wovon (k − 1)ai zwischen verschiedenen Clustern verlaufen. Es ergibt sich: X |E(C)| m − (k − 1)a 2(k − 1)a 2k − 2 = =1− =1− . m m ka(a + 1) k(a + 1) (5.3) C∈C Da dieser Ausdruck nur von k und a abhängt, muss die Clusterung C = (C1 , . . . , Ck ) mit maximaler Modularität den rechten Teil der Modularitätsformel minimieren, also deg(C1 )2 , deg(C2 )2 , . . . , deg(Ck )2 . Dies erfordert eine Aufteilung der Element-Knoten zwischen den Clustern, die so gleichmäßig wie möglich bezüglich der Summe der Knotengrade pro Cluster ist. Im Optimalfall können wir an einen jeden Cluster Element-Knoten zuweisen, die Elementen entsprechen, die sich zu b = a/k aufsummieren. In diesem Fall ist die Aufsummierung der Knotengrade der Element-Knoten in jeder Clique gleich k · a/k = a. Dies ergibt deg(Ci ) = a2 + a für jeden Cliquen-Cluster Ci , i = 1, . . . , k. Schließlich ergibt sich: deg(C1 )2 + · · · + deg(Ck )2 ≥ k(a2 + a)2 = ka2 (a + 1)2 . (5.4) Gleichheit gilt nur für den Fall, dass eine Zuweisung von b an jeden Cluster möglich ist. Beachten Sie zudem, dass G(A), der in der Reduktion aus A konstruierte Graph, polynomielle Größe in der unären Kodierungsgröße von A hat. Da 3-Partition streng N P-vollständig ist, reicht eine solche Transformation für unsere Zwecke aus. Es bleibt noch zu zeigen, dass sich aus der Lösung des einen Problems eine Lösung für das jeweils andere Problem ergibt. “⇐” Falls es eine Clusterung C gibt mit q(C) ≥ K(A) = 1 − 66 2k − 2 ka2 (a + 1)2 (k − 1)(a − 1) − 2 2 = , 2 k(a + 1) k a (a + 1) k(a + 1) 5.1. Zielfunktion Modularität dann wissen wir, dass diese Clusterung die Element-Knoten perfekt auf die k CliquenCluster aufteilen muss. Weil jedes Element in genau einem Cluster enthalten ist, erzeugt dies eine Lösung für die 3-Partition-Instanz. Mit dieser Wahl von K(A) ist also die Instanz (G(A), K(A)) von Modularity nur dann erfüllbar, falls auch die Instanz A von 3-Partition erfüllbar ist. Oder umgekehrt: Ist A nicht erfüllbar, dann auch nicht (G(A), K(A)). “⇒” Für die andere Beweisrichtung nehmen wir an, dass die Instanz A von 3-Partition erfüllbar ist. Dann gibt es eine Partition in k Mengen derart, dass die Summe über jede Menge k1 ·a = b ist. Wenn wir den zugehörigen Graphen clustern, indem wir die ElementKnoten jeder Menge mit einer anderen Clique vereinigen, erhalten wir eine Clusterung mit Modularität K(A). Also ist dann auch die Instanz (G(A), K(A)) von Modularity erfüllbar. Die Definition von Modularität sowie das Ergebnis aus Theorem 5.5 lassen sich im Übrigen leicht auf gewichtete Graphen übertragen. Modularität hat einige bekannte Nachteile, z. B. das sogenannte Auflösungsproblem. Das bedeutet, dass ein und derselbe Cluster in zwei Graphen mit stark unterschiedlicher Größe mal als eigenständiger Cluster erkannt wird und mal nicht (weil er in dem Fall in einen größeren Cluster integriert wird). Dieses Auflösungsproblem kann man teilweise durch ein Gewichtsschema beseitigen, aber einige Probleme bleiben weiterhin bestehen. Letztlich haben aber auch andere populäre Zielfunktionen Nachteile – die Wahl der Zielfunktion wird sich daher meist nach dem Anwendungsfall richten müssen. Übung 5.10. Zeigen Sie, dass für die Modularitätsfunktion gilt: P 2 ! deg(v) |E(C)| v∈C − m 2m C∈C 1 X deg(i) deg(j) · δ(C(i), C(j)), = Aij − 2m 2m X ij wobei δ(a, b) das Kronecker-Delta ist mit δ(a, b) = 1, falls a = b und 0 sonst. C(i) bezeichnet den Cluster des Knotens i. Übung 5.11. Zeigen Sie für eine 2-Clusterung C und ihren Modularitätswert: Q(C) = 1 T x Bx, 4m wobei x ein Indikatorvektor mit xi ∈ {−1, 1} ist und B die Modularitätsmatrix mit Bij = Aij − deg(i) deg(j) . 2m 67 5. Clusteranalyse 5.2. Spektrale Optimierung von Modularität 5.3. Die Louvain-Methode Die Louvain-Methode geht auf vier Wissenschaftler zurück, die zum Zeitpunkt der Entwicklung der Methode alle in der belgischen Stadt Louvain forschten – daher der Name. Die Methode geht lokal und gierig (greedy) vor und verwendet einen Mehrebenen-Ansatz. Die unten stehende Beschreibung ist den Folien entnommen und wird bald überarbeitet. • Initialisierung: Jeder Knoten ist sein eigener Cluster. • Danach: Zwei Phasen, die sich wiederholen: • Phase 1, lokale Verbesserung – Für jeden Knoten v lokal entscheiden, ob eine Wechsel in die Community des Nachbarn eine Verbesserung der ZF (Modalität) ergibt. – Wechsel von v in Community des Nachbarn mit stärkster positiver Verbesserung. – Wiederholung, bis keine Verbesserung möglich. – Abarbeitungsreihenfolge der Knoten beliebig, z.B. zufällig. • Phase 2, Schrumpfen des Graphen: – Kontraktion jeder gefundenen Community zu einem einzelnen Knoten. – Aktualisierung der Knoten- und Kantengewichten: Schleifen erhalten Gewicht aller alten Intra-Cluster-Kanten, die übrigen Kanten erhalten das Gewicht der alten Kanten zwischen den zugehörigen Communitys. 5.4. Verbesserung von Clusterungen mit Gütegarantie Wir haben bereits gesehen, dass es schwierig ist, optimale Clusterungen zu berechnen. Modularität ist dabei nur eine Zielfunktion unter vielen, wenn auch eine populäre. Dennoch wollen wir noch zwei weitere Zielfunktionen betrachten, die sich in ihrem Aufbau ähneln. Allen genannten Zielfunktionen ist gemeinsam, dass sie sehr große oder sehr kleine Cluster typischerweise vermeiden. Definition 5.12 (Quotientenwertung). Sei G = (V, E) und S ⊆ V . Sei |∂S| das Gesamtgewicht der Kanten, die zwischen S und S̄ verlaufen. Die Quotientenwertung (engl.: quotient score) ist |∂(S)| Q(S) = . min{π(S), π(S̄)} Dabei sei π eine Funktion, die jedem Knoten einen positiven Wert zuweist. Beispiel 5.13 (Beispiele für π-Funktionen). Oft verwendete Beispiele solcher Quotientenwertungen sind der Quotientenschnitt und die Leitfähigkeit: 68 5.4. Verbesserung von Clusterungen mit Gütegarantie • π(v) = 1 ∀v ∈ V (quotient cut) oder • π(v) = deg(v) ∀v ∈ V (conductance). Man kann das Clustering-Problem so definieren, dass wir bei einem gegebenen Graphen die Quotientenwertung für einen Schnitt (S, S̄) optimieren wollen. Dieses Problem ist für die in Beispiel 5.13 genannten Ausprägungen N P-schwer (und als Entscheidungsproblem N P-vollständig). Hier gehen wir aber einen anderen Weg und versuchen, eine gegebene Clusterung eines Graphen weiter zu verbessern. Problem 5.14 (Finde verbesserte Lösung). • Eingabe: G = (V, E), A ⊆ V mit π(A) ≤ π(Ā) • Ausgabe: S ⊆ V mit Q(S) < Q(A), sofern diese existiert. 5.4.1. Algorithmus Bevor wir zu der Idee des Algorithmus kommen, erinnern wir uns an das grundlegende Max-flow-min-cut-Theorem (für die Notation verweisen wir an Lehrbücher zu Netzwerkflüssen oder zu kombinatorischer Optimierung): Theorem 5.15. Die folgenden drei Aussagen sind äquivalent: 1. f ist ein maximaler Fluss in G. 2. Das Residualnetzwerk Gf enthält keinen augmentierenden Pfad. 3. Für mindestens einen Schnitt (S, T ) ist der Wert des Flusses gleich der Kapazität des Schnittes: |f | = c(S, T ). Für unsere Zwecke reicht es zu wissen, dass man aus dem maximalen Fluss den minimalen Schnitt rekonstruieren kann. Natürlich sind wir nicht direkt an minimalen Schnitten interessiert, weil diese überhaupt keine Balance garantieren. Aber wir werden sehen, dass sich die Lösung eines abgewandelten Flussproblems sehr wohl für unsere Zwecken nutzen lässt. Die Idee des Algorithmus besteht darin, den Graphen auf geeignete Weise in ein Flussnetzwerk zu transformieren. Bei dieser Transformation werden die aktuelle Lösung und deren Qualität berücksichtigt. Aus der Lösung des zugehörigen Flussproblems wird dann der minimale Schnitt und daraus eine Partition von V (G) berechnet. Wie wir sehen werden, kann man sogar Gütegarantien für die so entstandene Clusterung abgeben. Die Transformation des Eingabegraphen sowie des zugehörigen Clusterings in ein Flussnetzwerk geschieht folgendermaßen: Definition 5.16 (Transformation der Eingabe in Flussnetzwerk). • Eingabe: G = (V, E), A ⊆ V, α ∈ [0, ∞) • Ausgabe: GA (α) mit 69 5. Clusteranalyse • V (GA (α)) = V ∪ {s, t}, • E(GA (α)) = E ∪ (s, v)|v ∈ A ∪ {(v, t)|v ∈ Ā}, • w(s, v) = απ(v), • w(v, t) = απ(v)f (A) mit f (A) = π(A)/π(Ā) ≤ 1, • w(u, v) = wG (u, v). Beispiel 5.17. Beobachtung 5.18. Einfaches Nachrechnen ergibt für das gemäß Definition 5.16 entstandene Flussnetzwerk: • Die Gesamtkapazität der Quellkanten ist gleich der Gesamtkapazität der Senkkanten. • Für die Kosten von (S, S̄) gilt: costA,α (S) = |∂(s)| + απ(A ∩ S̄) + απ(S ∩ Ā)f (A). Die ursprüngliche Quotientenwertung bezieht sich nur auf das Endergebnis, also auf die Clusterung S, aber nicht auf die Eingabeclusterung A. Damit A im Algorithmus auf sinnvolle Weise den Optimierungsprozess steuern kann, wandeln wir die Zielfunktion ab: Definition 5.19. Sei A ⊆ V derart, dass π(A) ≤ π(Ā) und sei S 6= A. Wir definieren: DA (S) = π(S ∩ A) − π(S ∩ Ā)f (A) mit f (A) := π(A)/π(Ā) ≤ 1 und ( |∂(S)|/DA (S) Q̃A (S) = +∞ , falls DA (S) > 0, , falls DA (S) ≤ 0. Beobachtung 5.20. • Es gilt immer: DA (S) ≤ π(S). • Falls S 6= A und nicht S ⊂ A, gilt sogar: DA (S) < π(S). Der vollständige Algorithmus ist (etwas abstrahiert) als Algorithmus 5.1 dargestellt. Wir hatten bereits angedeutet, dass uns der Algorithmus eine Gütegarantie erlaubt. Theorem 5.21. Sei A eine Menge mit π(A) ≤ π(Ā) und sei S = Improve(A). Dann gilt: 1. Für jede Menge C ⊆ A gilt: Q(S) ≤ Q(C). 70 5.4. Verbesserung von Clusterungen mit Gütegarantie Algorithm 5.1 Verbesserung der Quotientenwertung function Improve(G,A) S0 = A; i = 0 α0 = Q̃A (A) = Q(A) < ∞ repeat Berechne minimalen s-t-Schnitt (Si+1 , Si+1 ) in Graph GA (αi ) αi+1 = Q̃a (Si+1 ) i=i+1 until αi ≥ αi−1 return Si end function 2. Falls C eine Menge ist, für die π(A ∩ C) π(A) π(A) ≥ + π(C) π(V ) π(V ) für ein > 0 gilt, dann erfüllt die Ausgabe S 1 Q̃A (S) ≤ Q(C). 3. Der Algorithmus Improve läuft in polynomieller Zeit. Theorem 5.21 stellt fest, dass jede Iteration ein Ergebnis liefert, das mindestens so gut ist wie das Ergebnis der besten Teilmenge der bisherigen Lösung. Der Beweis des Theorems erfolgt schrittweise im nächsten Abschnitt. Lemma 5.22 als Teil dieses Beweises sagt demnach aus, dass die Lösung S das Optimum 1 -approximiert, falls die Lösung der Eingabe A genügend Übereinstimmung mit dem Optimum hat. Die Bedingung zur Übereinstimmung bei π(v) = 1 ∀v ∈ V ist, dass der Anteil von C, der auch in A liegt, etwas größer sein muss als der erwartete Anteil von C in einer Zufallsmenge der Größe von A. 5.4.2. Analyse des Algorithmus Lemma 5.22. 1. Der Algorithmus Improve(G, A) berechnet eine Menge S, die Q̃A (S) minimiert. 2. Bei ganzzahligen positiven Kantengewichten führt der Algorithmus höchstens π(V )2 Iterationen durch. 3. Bei ungewichteten Kanten führt der Algorithmus höchstens |E| Iterationen durch. Beweis. (1) Bei gegebenem A sei α∗ = min Q̃A (X). X⊆V 71 5. Clusteranalyse Wir werden zeigen, dass die Menge S=Improve(A) die Gleichheit Q̃A (S) = α∗ erfüllt. Dazu zeigen wir zunächst, dass wir eine Menge X mit Q̃A (X) < α durch das Lösen eines s-t-Flussproblems in GA (α) finden können, falls eine solche Menge existiert. Fixiere dazu α ∈ (0, ∞) und sei Sα die feste Menge, die die Kosten costA,α (Sα ) minimiert. Wir werden zeigen, dass Q̃(Sα ) < α gilt, falls es eine Menge X ⊂ V mit Q̃(X) < α gibt. Dazu stellen wir fest, dass Q̃(X) < α gdw. ∂(X) − αDA (X) < 0 nach Definition. Daher folgt aus der Existenz einer Menge X ⊆ V mit Q̃(X) < α auch costA,α (Sα ) ≤ costA,α (X) = απ(A) + (∂(X) − αDA (X)) < απ(A). Die Kosten von Sα lassen sich durch Umformung auch schreiben als costA,α (Sα ) = απ(A)+(∂(S)−αDA (S)). Dann haben wir απ(A)+(∂(Sα )−αDA (Sα )) = costA,α (Sα ) < απ(A). Aus der Ungleichung folgt ∂(Sα ) − αDA (Sα ) < 0 und daher auch Q̃(Sα ) < α. Da wir demnach in jeder Iteration eine Verbesserung in Q̃ herbeiführen und erst stoppen, wenn es keine Verbesserung mehr gibt, wird das Minimum gefunden. Für jeden Schritt, in dem die Schleife nicht abbricht, sind sowohl αi als auch αi+1 endlich. Daher sind sowohl DA (Si+1 ) als auch DA (Si ) größer als 0 gemäß Definition der α-Werte. Daher können wir schreiben: costA,α−1 (Si ) = αi−1 π(A) + (∂(Si ) − αi−1 DA (Si )) = αi−1 π(A) + DA (Si )(Q̃A (Si ) − αi−1 ) = αi−1 π(A) + DA (Si )(αi − αi−1 ). Analog dazu gilt costA,α−1 (Si+1 ) = αi−1 π(A) + DA (Si+1 )(αi+1 − αi−1 ). Weil Si die Kosten minimiert, gilt costA,α−1 (Si ) ≤ costA,α−1 (Si+1 ). Daraus folgt DA (Si ) · (αi − αi−1 ) ≤ DA (Si+1 ) · (αi+1 − αi−1 ). Wegen αi+1 < αi < αi−1 < ∞ gilt auch wie gewünscht DA (Si+1 ) < DA (Si ) (an dieser Stelle gilt tatsächlich in Abweichung zur Originalarbeit echt kleiner, wie man leicht nachprüfen kann). (2) Sind die Knotengewichte π(v) positive ganze Zahlen, dann können die Größen π(S ∩ A) und π(S ∩ A) jeweils höchstens π(V ) mögliche Werte annehmen. Daher kann DA (S) höchstens quadratisch so viele Werte annehmen. Weil DA (S) in jeder Iteration verringert wird, ergibt sich die maximale Laufzeit. (3) Weil sowohl Q̃A (Si ) als auch DA (Si ) in jeder Iteration verringert werden, muss dies auch für ∂(Si ) gelten. Bei ungewichteten Kanten kann ∂(Si ) höchstens |E| unterschiedliche Werte annehmen. Lemma 5.23. Falls für eine Menge C π(A ∩ C) π(A) π(A) ≥ + π(C) π(V ) π(V ) für ein > 0 gilt, dann gilt Q̃A (C) ≤ 1 Q(C). 72 5.5. Weiterführende Literatur Beweis. Aufgrund der Definition von Q und Q̃ reicht es, DA (C) ≥ π(C) zu zeigen. Es gelte die Voraussetzung des Lemmas. Dann: DA (C) π(C ∩ A) π(C ∩ A) = − f (A) π(C) π(C) π(C) π(A) π(A) π(A) π(A) ≥( + ) − f (A)(1 − − ) π(V ) π(V ) π(V ) π(V ) π(A) π(A) π(A) π(A) π(A) π(A) + f (A) )+( − + ) = ( π(V ) π(V ) π(V ) π(A) π(A) π(V ) π(A) π(V ) π(A) =·1+ (1 − + ) π(V ) π(A) π(A) = . Dabei wurden ausgenutzt: 1. Definition DA (C) 2. Voraussetzung 3. Definition f (A) 4. Mengenregeln 5.4.3. Zusammenfassung Die Verbindung zwischen minimalen Schnitten und maximalen Flüssen lässt sich auf vielfältige Weise nutzen. Beim betrachteten Algorithmus geht die Qualität der aktuellen Lösung bzgl. der Zielfunktion in die Formulierung des Flussproblems ein. Daraufhin findet jede Iteration das Optimum einer abgewandelten Zielfunktion auf Basis der Flusslösung. 5.5. Weiterführende Literatur Die (für uns alternative) Definition der Modularität sowie die Herleitung der spektralen Methode findet sich bei Newman [New10a]. Die graphentheoretische Definition von Modularität geht auf die Darstellung von Brandes et al. [BDG+ 08] zurück; dort findet sich auch der Beweis der N P-Vollständigkeit. Die Louvain-Methode stammt von Blondel et al. [BGLM08]. Ihre parallele Version wurde erstmals (in skalierbarer Form) in der Konferenzversion von Staudt und Meyerhenke [SM16] vorgestellt. Mittlerweile gibt es eine ganze Reihe von parallelen Varianten für verschiedene parallele Architekturen. Der Improve-Algorithmus geht wiederum auf Andersen und Lang [AL08] zurück. 73 6. Ausbreitung von Krankheiten in Netzwerken Die erste Reaktion beim Lesen des Titels dieses Kapitels mag Verwunderung sein. Verwunderung darüber, wieso Informatiker die Ausbreitung von Krankheiten betrachten. Auf den zweiten Blick ist dies aber sehr nachvollziehbar, wenn man den Begriff “Krankheit” weit genug fasst und “elektronischen Befall” einbezieht. Nicht umsonst werden auch in der IT-Welt medizinische Begriffe wie “Virus” der Medizin entliehen. Netzwerkanalyse-Methoden können aber tatsächlich auch medizinischen Nutzen haben. Dies gilt insbesondere dann, wenn Infektionskrankheiten, die den Menschen befallen, modelliert, simuliert und eingeschätzt werden. Denken wir dazu an Ausbrüche von SARS, AIDS, Ebola oder Schweinegrippe. Politisch kann es sehr interessant sein zu wissen, wie entsprechende Ausbrüche (Schweregrad, geographische Konzentration) vermutlich verlaufen werden. Nun fragen Sie sich vielleicht selbst am Ende dieser Vorlesungsreihe noch, was AIDS oder andere Krankheiten mit Netzwerken zu tun haben. Letztlich geht man bei der Modellierung solcher Krankheiten per Netzwerkanalyse sehr ähnlich vor. Möglicherweise betroffene Personen werden als Knoten dargestellt. Eine Kante existiert zwischen zwei Knoten, wenn diese miteinander “in Kontakt” getreten sind – und zwar so, dass die Krankheit prinzipiell übertragen werden kann. Bei einige Krankheiten genügt dafür räumliche Nähe, bei anderen ist bspw. Geschlechtsverkehr notwendig. Ein solcher Kontakt ist aber typischerweise nicht hinreichend für die Weitergabe einer Infektion; diese geschieht nur mit einer gewissen Wahrscheinlichkeit. Ist eine solche Wahrscheinlichkeit abhängig vom konkreten Knotenpaar, ist sie üblicherweise ein Kantenlabel. Für manche Krankheiten ergeben sich wiederum global gültige Werte. 6.1. Verzweigungsprozess Zunächst betrachten wir ein sehr, sehr einfaches Modell, basierend auf der Darstellung von Easley und Kleinberg [EK10, Kapitel 21]. Bereits hier lassen sich aber einige wichtige Einsichten ableiten. Das Modell bezeichnen wir als Verzweigungsprozess und es funktioniert so: • (Erste Welle) Nehmen wir an, eine infizierte Person P erscheint in einer bisher gesunden Population. Beim Erscheinen wird die Krankheit mit Wahrscheinlichkeit p auf jede Person übertragen, die P trifft. Die Wahrscheinlichkeit p ist dabei völlig unabhängig, also auch von der Nachbarschaft. Nehmen wir an, P trifft k Personen, 75 6. Ausbreitung von Krankheiten in Netzwerken während er ansteckend ist. Abhängig vom Ausgang der jeweiligen Zufallsexperimente werden dann einige der k Personen mglw. infiziert, andere nicht. • (Zweite Welle) In der zweiten Welle trifft jede Person, die P in der ersten Welle getroffen hat, auf jeweils k (unterschiedliche) Personen. Somit werden in der zweiten Welle k · k = k 2 Personen kontaktiert. Jede in der ersten Welle infizierte Person kann die Krankheit wieder mit Wahrscheinlichkeit p unabhängig zu jedem ihrer k Nachbarn weitergeben. • (Nachfolgende Wellen) Weitere Infektionswellen werden analog gebildet. Jede in der vorigen Welle kontaktierte Person kontaktiert selbst wieder k Personen und gibt die Krankheit unabhängig mit Wahrscheinlichkeit p weiter. Unter der Annahme, dass die jeweiligen Kontakte disjunkt sind, lässt sich ein solcher Verzweigungsprozess als Baum darstellen, siehe Abbildung ??. Offensichtlich stirbt der Prozess aus, wenn in einer Welle niemand neu infiziert wird. Der Prozess hat also nur zwei Möglichkeiten: entweder er stirbt aus oder setzt sich unendlich fort. Welche der beiden Alternativen eintritt, hängt von der Reprodukationszahl R0 ab. Diese gibt die erwartete Zahl neuer Fälle an, die durch eine einzelne Person hervorgerufen werden. In unserem Modell gilt: R0 = k · p. Hier ergibt sich wieder ein Phasenübergang, dieses Mal bezüglich R0 : Theorem 6.1. Falls R0 < 1, dann stirbt die Krankheit mit Wahrscheinlichkeit 1 nach endlich vielen Schritten aus. Falls R0 > 1, dann bleibt die Krankheit mit Wahrscheinlichkeit größer als 0 erhalten und infiziert in jeder Welle mindestens eine Person. Auch wenn dieses Modell sehr einfach ist, erkennt man bereits zwei wesentliche “Stellschrauben”, mit denen man eine Epidemie eindämmen kann. Zum einen sollte man infizierte Personen isolieren und zum anderen die Übertragungswahrscheinlichkeit senken (bspw. durch Impfungen oder besondere Vorsichtsmaßnahmen). Zwar braucht es für diese Erkenntnis erst mal kein mathematisches Modell. Wenn es aber darum geht, aus gesundheitspolitischer Sicht eine Kosten-Nutzen-Abwägung zu machen, können mathematische Modelle natürlich sehr hilfreich sein. Wir werden daher nachfolgend netzwerkspezifische Modelle betrachten, mit denen man zu realistischeren Modellen kommen kann. 6.2. SI*-Modelle 6.3. Cyberabwehr als Optimierungsproblem 6.3.1. Einführung Computernetzwerke können vielfältige Ausprägungen haben. Wir gehen in unserer allgemeinen Modellierung als gewichteter Graph daher von einem sehr allgemeinen Szenario 76 6.3. Cyberabwehr als Optimierungsproblem aus. Knoten repräsentieren dabei grundlegende Elemente des Gesamtsystems (bspw. einen einzelnen Rechenknoten, Sensor oder auch Switch). Kanten beschreiben Interaktionskanäle zwischen den Elementen, die technisch auf unterschiedliche Arten realisiert sein können. Die Stärke der Interaktion wird durch das Kantengewicht ausgedrückt. Die Elemente des Netzwerks können in zwei Zuständen sein, anfällig (S) oder infiziert (I). Ein anfälliges Element kann durch einen Cyberangriff infiziert werden, während ein infizierter Knoten bspw. durch ein Anti-Viren-Programm oder eine Neuinstallation geheilt werden kann. Dennoch ist die Heilung meist nur von sehr kurzer Dauer, weil dadurch nicht alle offenen Lücken geschlossen werden. Der neue Zustand nach Eliminierung des Schädlings ist daher wieder S (und nicht R), so dass wir hier von einem SIS-Modell ausgehen. Die Kernfrage zur Vermeidung oder Abwehr eines Angriffs ist, wie wir die Funktionalität des Netzwerks möglichst gut aufrecht erhalten können, aber gleichzeitig das Netzwerk schützen bzw. säubern. Diese Problemstellung werden wir als Optimierungsproblem modellieren und (wegen der Problemkomplexität nicht exakt) mit einer MultilevelHeuristik lösen. Darstellung und Ergebnisse gehen auf Leyffer und Safro [LS13] zurück. Die Arbeit zeigt exemplarisch, wie man sehr schwierige Optimierungsprobleme in Netzwerken durch eine geschickte Kombination verschiedener algorithmischer Techniken lösen kann – zwar nicht optimal, aber dafür auf recht großen Instanzen und mit einer in der Praxis häufig sehr guten Lösungsqualität. Beginnen wir mit etwas Notation: Definition 6.2. • S: Zahl der anfälligen Knoten • I: Zahl der infizierten Knoten • β: Übertragungsrate • γ: Heilungsrate • φi,t : Wahrscheinlichkeit, dass Knoten i im Zeitpunkt t infiziert ist Aus unseren Überlegungen im vorigen Abschnitt können wir folgern: Beobachtung 6.3. Für die zeitliche Entwicklung der Zahl der infizierten bzw. der anfälligen Elemente gilt: dI = λS − γI dt dS = γI − λS. dt Dabei ist λ = βhkiI/(S + I) die durchschnittliche Infektionsrate im Netzwerk und hki der durchschnittliche Knotengrad. Eine feste Infektionsrate zu verwenden (wie wir das bisher gemacht haben), ist in der Realität oft nicht angebracht. Die Übertragung einer Krankheit von Mensch zu Mensch wird auch dadurch beeinflusst, wie eng oder von welcher Art der Kontakt zwischen diesen 77 6. Ausbreitung von Krankheiten in Netzwerken beiden gewesen ist. Auch bei Computernetzwerken mag sie variieren, weil verschiedene Elemente bspw. unterschiedlich gut geschützt sind. Wir verwenden daher nachfolgend eine Infektionsmatrix P n×n = (pij ), wobei pij die Wahrscheinlichkeit angibt, dass i von j infiziert wird. Beachten Sie, dass die Krankheit in der Matrix demnach von j nach i “fließt”! Sei nun hi,t die Wahrscheinlichkeit, dass ein anfangs gesunder Knoten i zum Zeitpunkt t nicht infiziert ist. Dann gilt offensichtlich unter Annahme stochastischer Unabhängigkeit: hi,t = Πj∈N (i) (1 − pij φj,t−1 ). 6.3.2. Optimierungsmodell Es ist sicher eine sinnvolle Annahme, dass infizierte Elemente abgeschaltet werden, damit sie ohne weitere Schadwirkung im Netzwerk vom Schädling geheilt werden können. Entfernt man allerdings einen Knoten aus dem Netzwerk, werden auch alle zugehörigen Kanten und somit mögliche Kommunikationskanäle und -wege entfernt. Wir wollen daher das Gesamtgewicht der operierenden Kanten maximieren, dabei gleichzeitig aber den Infektionsgrad an jedem Knoten gering halten. Formal ergibt sich folgendes Optimierungsmodell (unter der Annahme, dass die Infektion in einer Nachbarschaft unabhängig zwischen Nachbarn erfolgt): Problem 6.4. Sei G = (V, E, w) ein gewichteter Graph, wobei w(u, v) die Stärke der Verbindung (u, v) angibt. Die binäre Variable xi gebe an, ob Knoten i an- (1) oder ausgeschaltet (0) ist. Die reelle Variable bi ∈ [0, 1] gebe den Grenzwert für den Infektionsgrad eines Knotens i an. Dann ergibt sich für unser Optimierungsproblem: max x X wij xi xj (6.1) ij∈E udNB xi − Πj∈N (i) (1 − pij φj,t−1 xj ) ≤ bi ∀i ∈ V xi ∈ {0, 1} ∀i ∈ V. (6.2) (6.3) Veranschaulichen wir die Nebenbedingung 6.2 an einem kleinen Zahlenbeispiel: Sei dazu bi = 0.4 für einen Knoten i. Der Sinn dieser Nebenbedingung ist, den Infektionsgrad angeschalteter Knoten zu beschränken. Ist xi = 0, ist die Nebenbedingung auf triviale Weise erfüllt, da der linke Ausdruck negativ wird. Falls xi = 1 ist, dann wollen wir verhindern, dass der Infektionsgrad über 40% steigt. Dazu müssen wir die Nachbarschaft betrachten. Der Ausdruck (1−pij φj,t−1 xj ) gibt dabei an, mit welcher Wahrscheinlichkeit keine Krankheit vom Nachbarn j in diesem Zeitschritt übertragen wird. Das Produkt dieser Einzelwahrscheinlichkeiten ergibt dann wegen der Unabhängigkeit die Gesamtwahrscheinlichkeit. Zieht man sie von xi = 1 ab, ergibt sich der Infektionsgrad. 78 6.3. Cyberabwehr als Optimierungsproblem 6.3.3. Heuristische Lösung durch ein Mehrebenen-Verfahren Optimierungsproblem 6.4 ist ein nicht-konvexes und nichtlineares ganzzahliges Optimierungsproblem. Das Berechnen einer optimalen Lösung ist somit N P-schwer, das zugehörige Entscheidungsproblem N P-vollständig. Eine exakte Lösung des Problems ist daher nur für recht kleine Instanzen mit einigen Hundert Knoten möglich. Da ein Computernetzwerk in großen Unternehmen aber aus Tausenden von einzelnen Elementen bestehen kann, sind wir an Lösungsmöglichkeiten für größere Probleme interessiert. In diesem Fall verwenden wir ein Mehrebenen-Verfahren (engl.: multilevel approach), mit dem auch Netzwerke mit Hunderttausenden von Knoten in akzeptabler Zeit mit hoher Qualität gelöst werden können. Zur Beschreibung einer Mehrebenen-Methode müssen wir angeben, wie die drei Phasen (Vergröberung, initiale Lösung auf der gröbsten Ebene und lokale Verbesserung nach Interpolation) konkret implementiert werden sollen. Der vorliegende Ansatz orientiert sich sehr nah an Mehrgitter-Verfahren, wie sie in der angewandten Mathematik zur Lösung von linearen Gleichungssystemen und anderen numerischen Problemen eingesetzt werden. Vergröberung. Die Vergröberung erfolgt rekursiv, bis ein gröbster Graph erstellt wurde, der “klein genug” ist. “Klein genug” bedeutet dabei häufig, dass ein teures Lösungsverfahren für einen Graphen dieser Größe eine akzeptable Geschwindigkeit hat. Da dies anwendungsabhängig ist, müssen wir hier etwas vage bleiben. Wegen des rekursiven Vorgehens genügt es, in der Folge zwei Ebenen zu betrachten. Um den groben Graphen G0 zu erstellen, werden zunächst die Knoten von G ausgewählt, die in G0 übernommen werden sollen. Diese Menge nennen wir C (von engl.: coarse). Die Knoten, die nicht übernommen werden, gehören zur Menge F (feine Kno· ten). Es gilt: V = C ∪ F . Häufig werden die Knoten von C als (große) unabhängige Menge gewählt. Diesem Vorgehen liegt die Idee zugrunde, dass C zwar möglichst klein sein sollte, um die Laufzeit des Verfahrens niedrig zu halten; gleichzeitig muss aber jeder Knoten aus V entweder in C sein oder einen Nachbarn aus C haben. Algorithm 6.1 Wahl der groben Knotenmenge C 1: function ChooseCoarseNodes(G = (V, E)) 2: Ausgabe: Menge C der groben Knoten 3: F ←V 4: C←∅ 5: for i ← with nodes with high φi ) P1 to n doP(starting −1 6: if j∈C %−1 / % ≥ θ then j∈V ij ij 7: C ← C ∪ {i} 8: F ← F \ {i} 9: end if 10: end for 11: return C 12: end function 79 6. Ausbreitung von Krankheiten in Netzwerken Algorithmus 6.1 stellt das Verfahren im Pseudocode dar. Die Traversierung von V geschieht dabei so, dass Knoten mit hohen Infektionswerten φi zuerst betrachtet werden. Eine exakte Sortierung ist dabei nach Aussage der Originalarbeit allerdings nicht notwendig. Der Standardwert für θ in der AMG-Literatur ist 0,5; hier sind aber auch andere Werte denkbar. Kleinere Werte führen zu größeren Mengen C und somit zu (tendentiell) mehr Hierarchie-Ebenen. Dies kostet natürlich mehr Speicher und Rechenzeit, kann sich aber unter Umständen durch ein besseres Konvergenz-Verhalten auszahlen. Bleibt noch zu erklären, was % ist. Bei der Vergröberung ist es wichtig zu wissen, wie “nah” sich zwei Knoten auf der feinen Ebene sind. Dabei ist hier nicht unbedingt die graphentheoretische Distanz gemeint. Im vorliegenden Kontext bezieht sich %ij auf die algebraische Distanz zwischen i und j. Dies ist ein von Random Walks abgeleitetes Maß. Sein Kehrwert gibt dann keine Distanz, sondern eine Ähnlichkeit an. Dieses Maß bezieht nicht nur die Länge eines kürzesten Weges ein, sondern versucht zu berücksichtigen, ob es viele oder wenige Wege kurzer Länge zwischen i und j gibt. Hat man die Knoten von C ausgewählt, werden die Interpolationsgewichte festgelegt. Diese geben an, wie die Werte eines F -Knoten durch die Interpolation seiner C-Nachbarn näherungsweise rekonstruiert werden. Das Ziel muss dabei sein, dass jeder F -Knoten auf sinnvolle Art und weise interpoliert wird. Dies lässt sich beispielsweise durch folgendes Schema für die Restriktionsmatrix R ∈ R|Vf |×|C| (für die Interpolationsmatrix gilt P = RT ) erreichen: −1 P −1 C %ij / k∈N C (i) %ik für i ∈ F, j ∈ N (i) T Rij = 1 (6.4) für i ∈ C, j = i 0 sonst Dabei sollten zu kleine Werte auf 0 gesetzt werden, wobei häufig ein heuristisch bestimmter Schwellwert eingesetzt wird. Die Laplacematrix Lc des groben Graphen lässt sich dann anhand der Formel Lc = RLf RT (6.5) berechnen. Somit ergibt sich ein grobes Kantengewicht WIJ zwischen den groben Knoten I und J durch: X T WIJ = RIk wk` R`J . k6=` Initiale Lösung auf der gröbsten Ebene. Wenn das Problem klein genug ist, kann es auf der gröbsten Ebene durch aufwändige Verfahren gelöst werden, mitunter sogar exakt. Dies wird für das vorliegende Problem mit dem exakten Löser MINOTAUR gemacht; dazu wird das grobe Problem gegenüber Optimierungsproblem 6.4 allerdings noch leicht umformuliert: X X max WIJ XI XJ + AI XI (6.6) X IJ∈Ec I∈Vc udNB XI − ΠJ∈N (I) (1 − PIJ ΦJ,t−1 XJ ) ≤ BI ∀I ∈ Vc 80 (6.7) 6.3. Cyberabwehr als Optimierungsproblem XI ∈ {0, 1} ∀I ∈ Vc . (6.8) Der erste Unterschied besteht darin, dass nun über grobe Variablenmengen (zu erkennen an denPIndizes mit großen Buchstaben) iteriert wird. Außerdem kommt nun der lineare Term I∈Vc AI XI , der die feinen Kanten innerhalb eines groben Knotens (wenn man so will eine gewichtete Schleife) modelliert. Lokale Verbesserung nach Interpolation. Die normale Vorgehensweise von MultigridVerfahren bei der Interpolation ist die Multiplikation des Lösungsvektors mit der Matrix P = RT . Bei der Lösung dieses Optimierungsproblems wird von dieser Vorgehensweise leicht abgewichen. Zwar erhält jeder Knoten i ∈ C genauso wie bei der Multiplikation mit P seinen groben Wert, d. h. xi = XI . Bei den F -Knoten wird hier aber abgewichen und eine Extra-Routine zur Maximierung des Beitrags zur Zielfunktion aufgerufen. Aus Zeitgründen gehen wir auf diese allerdings nicht näher ein. Die so erhaltene initiale Lösung auf dieser Ebene wird dann durch eine Gauß-Seidel-ähnliche Relaxation verbessert. Aber auch in diesem Relaxations-Schritt wird von der in der Numerik üblichen Vorgehensweise abgewichen. Denn für unser Optimierungsproblem werden kleine Teilprobleme unabhängig voneinander gelöst. Dabei werden die Randbedingungen für die Knoten, die nicht zum aktuell betrachteten Teilproblem S gehören, fixiert. Dies hat zwar den Nachteil, dass hier ein (kleiner) Fehler gemacht wird, weil die Teilprobleme in der Regel natürlich voneinander abhängen. Aber auf diese Weise ergibt sich auch der Vorteil eines hohen Grades an Parallelität max x X i,j∈S wij xi xj + X i∈S,j ∈S / wij xi x̃j + X ai xi i∈S udNB xi − ki · Πj∈N (i)∩S (1 − pij φj,t−1 xj ) ≤ bi ∀i ∈ V xi ∈ {0, 1} ∀i ∈ V, (6.9) (6.10) (6.11) wobei x̃j eine feste Lösung für j ∈ / S ist und ki := Πj∈N (i)∩S (1 − pij φj,t−1 x˜j ). Setzt man nun die Komponenten für die drei Phasen Vergröberung, initiale Lösung und Interpolation mit lokaler Verbesserung zusammen, so erhält man ein vollständiges Mehrgitter- bzw. Mehrebenen-Verfahren. Wie man über die einzelnen Ebenen iteriert, ist problemspezifisch. Die Mehrgitter-Literatur führt dabei insbesondere V-, W- und F(MV)-Zyklen auf [?]. Experimentelle Ergebnisse. In ihrer experimentellen Studie betrachten Leyffer und Safro zunächst je 200 kleine Graphen für je drei verschiedene generative Modelle, ErdősRényi, Barabási-Albertund R-MAT. Die Ergebnisse sind in einem Performance-Plot in Abbildung 6.1 relativ zur exakten Lösung dargestellt. In einem Performance-Plot sortiert man üblicherweise die Instanzen aufsteigend bezüglich ihrer Qualität. Je steiler eine Kurve dann ansteigt, desto besser im Allgemeinen. Hier zeigt sich, dass etwa die Hälfte der Netzwerke optimal gelöst werden. Graphen vom Typus R-MAT und BarabásiAlbertwerden mit recht ähnlicher Qualität gelöst, wohingegen Erdős-Rényietwas abfällt. 81 Ratio between MA and optimal solution 6. Ausbreitung von Krankheiten in Netzwerken FAST RESPONSE TO INFECTION SPREAD 9 of 17 1 0.98 0.96 0.94 0.92 0 50 100 150 Networks ordered by ratios 200 Fig. 3. Comparison with optimal solutions for small networks. pointkleine represents a ratio between the objectives of MA Abbildung 6.1.: Vergleich mit200 optimaler LösungEach für 200 Netzwerke (ER schwarz, and optimal solutions, respectively, for one network. Solutions of MA are feasible. Circles, squares, and triangles correspond t R-MAT rot, BA grün). Quelle: Leyffer und Safro [LS13]. Erdös-Rényi, R-MAT, and Barabasi-Albert models, respectively. Trotzdem lässt sich festhalten, dass die Qualität hier insgesamt überzeugt, da maximal um 9% von der optimalen Lösung abgewichen wird. Ob sich diese sehr gute Qualität auf größere Instanzen überträgt, ist allerdings in der zu Grunde liegenden Arbeit nicht untersucht worden. Für weitere Ergebnisse, beispielsweise zu einem hochskalierten Netzwerk zu HIVÜbertragungen, wird auf die Originalarbeit verwiesen. 6.3.4. Fazit Die betrachtete Problemstellung und die gewählte Lösungsmethode hat uns tiefer in sogenannte Mehrebenen/-skalen/-gitterverfahren eingeführt. Durch eine geeignete Wahl der einzelnen Komponenten ist ein Verfahren entstanden, das auch für große Graphen sehr gute Lösungen liefert. Exakte Löser wären dafür viel zu langsam und die Metaheuristik Iterative Lokale Suche kann qualitativ nicht mithalten. Ob ein solches Verfahren im Ernstfall von einem Administrator zur Netzwerküberwachung eingesetzt würde, sei dahingestellt. Dennoch haben wir gelernt, wie ein Problem der Netzwerksicherheit als (schwieriges) Optimierungsproblem modelliert und mit vergleichsweise hoher Geschwindigkeit gelöst werden kann. Fig. 4. Infection spread network (|V | = 25,090, |E| = 28,284) constructed by sparse random connections among 100 generate networks that are similar to real HIV spread data. contains a network with 250 vertices, where each vertex corresponds to an individual. We generated 100 similar networks by using a multiscale network generator [32] and connected them by several random edges in order to create one big network (see Fig. 4). We simulated an immediate outbreak of th infection in 82 which initially 5% of vertices were associated with high level of infection (φi ∈ [0.8, 1]) and each edge had the same rate of infection transmission. Then five iterations of the infection spread wer performed; at each iteration, all vertices released their infection to the neighbours, and the updated φ wa ⎞ ⎛ # pij $ ∀i ∈ V φinew = min ⎝1, φiold + φjold ⎠ . p k∈Γi ik j∈Γ i Literaturverzeichnis [AB12] Auer, Bas F. ; Bisseling, Rob H.: Graph coarsening and clustering on the GPU. In: Bader, David A. (Hrsg.) ; Meyerhenke, Henning (Hrsg.) ; Sanders, Peter (Hrsg.) ; Wagner, Dorothea (Hrsg.): Graph Partitioning and Graph Clustering, 10th DIMACS Implementation Challenge Workshop, Georgia Institute of Technology, Atlanta, GA, USA, February 13-14, 2012. Proceedings Bd. 588, American Mathematical Society, 2012 (Contemporary Mathematics), 223 [AIY13] Akiba, Takuya ; Iwata, Yoichi ; Yoshida, Yuichi: Fast exact shortest-path distance queries on large networks by pruned landmark labeling. In: Proceedings of the ACM SIGMOD International Conference on Management of Data, SIGMOD 2013, New York, NY, USA, June 22-27, 2013, ACM, 2013. – ISBN 978–1–4503–2037–5, 349–360 [AL08] Andersen, Reid ; Lang, Kevin J.: An Algorithm for Improving Graph Partitions. In: Proceedings of the Nineteenth Annual ACM-SIAM Symposium on Discrete Algorithms. Philadelphia, PA, USA : Society for Industrial and Applied Mathematics, 2008 (SODA ’08), 651–660 [BBC+ 16] Bergamini, Elisabetta ; Borassi, Michele ; Crescenzi, Pierluigi ; Marino, Andrea ; Meyerhenke, Henning: Computing Top-k Closeness Centrality Faster in Unweighted Graphs. In: Goodrich, Michael T. (Hrsg.) ; Mitzenmacher, Michael (Hrsg.): Proceedings of the Eighteenth Workshop on Algorithm Engineering and Experiments, ALENEX 2016, Arlington, Virginia, USA, January 10, 2016, SIAM, 2016, 68–80 [BDG+ 08] Brandes, Ulrik ; Delling, Daniel ; Gaertler, Marco ; Gorke, Robert ; Hoefer, Martin ; Nikoloski, Zoran ; Wagner, Dorothea: On modularity clustering. In: Knowledge and Data Engineering, IEEE Transactions on 20 (2008), Nr. 2, S. 172–188 [BDG+ 16] Bast, Hannah ; Delling, Daniel ; Goldberg, Andrew V. ; MüllerHannemann, Matthias ; Pajor, Thomas ; Sanders, Peter ; Wagner, Dorothea ; Werneck, Renato F.: Route Planning in Transportation Networks. Version: 2016. https://doi.org/10.1007/978-3-319-49487-6_2. In: Kliemann, Lasse (Hrsg.) ; Sanders, Peter (Hrsg.): Algorithm Engineering - Selected Results and Surveys Bd. 9220. 2016, 19–80 [BE05] Brandes, Ulrik (Hrsg.) ; Erlebach, Thomas (Hrsg.): Network Analysis: Methodological Foundations [outcome of a Dagstuhl seminar, 13-16 April 83 Literaturverzeichnis 2004]. Bd. 3418. Springer, 2005 (Lecture Notes in Computer Science). – ISBN 3–540–24979–6 [BGG+ 08] Baur, Michael ; Gaertler, Marco ; Görke, Robert ; Krug, Marcus ; Wagner, Dorothea: Augmenting k -core generation with preferential attachment. In: NHM 3 (2008), Nr. 2, 277–294. http://dx.doi.org/10. 3934/nhm.2008.3.277. – DOI 10.3934/nhm.2008.3.277 [BGLM08] Blondel, V.D. ; Guillaume, J.L. ; Lambiotte, R. ; Mech, E.L.J.S.: Fast unfolding of communities in large networks. In: J. Stat. Mech (2008), S. P10008 [BMS+ 14] Bader, David A. ; Meyerhenke, Henning ; Sanders, Peter ; Schulz, Christian ; Kappes, Andrea ; Wagner, Dorothea: Benchmarking for Graph Clustering and Partitioning. In: Encyclopedia of Social Network Analysis and Mining. 2014, S. 73–82 [BP12] Brin, Sergey ; Page, Lawrence: Reprint of: The anatomy of a large-scale hypertextual web search engine. In: Computer Networks 56 (2012), Nr. 18, 3825–3833. http://dx.doi.org/10.1016/j.comnet.2012.10.007 [Bra01] Brandes, U.: A faster algorithm for betweenness centrality. In: J. Mathematical Sociology 25 (2001), Nr. 2, S. 163–177 [Bra16] Brandes, Ulrik: (2016), S. 1–19 [BV14] Boldi, Paolo ; Vigna, Sebastiano: Axioms for Centrality. In: Internet Mathematics 10 (2014), Nr. 3-4, 222–262. http://dx.doi.org/10.1080/ 15427951.2013.865686. – DOI 10.1080/15427951.2013.865686 Network positions. In: Methodological Innovations 9 [CGH+ 13a] Crescenzi, Pilu ; Grossi, Roberto ; Habib, Michel ; Lanzi, Leonardo ; Marino, Andrea: On computing the diameter of real-world undirected graphs. In: Theor. Comput. Sci. 514 (2013), 84–95. http://dx.doi.org/ 10.1016/j.tcs.2012.09.018. – DOI 10.1016/j.tcs.2012.09.018 [CGH+ 13b] Crescenzi, Pilu ; Grossi, Roberto ; Habib, Michel ; Lanzi, Leonardo ; Marino, Andrea: On computing the diameter of real-world undirected graphs. In: Theoretical Computer Science 514 (2013), S. 84–95 [EK10] Easley, David A. ; Kleinberg, Jon M.: Networks, Crowds, and Markets - Reasoning About a Highly Connected World. Cambridge University Press, 2010 http://www.cambridge.org/gb/knowledge/isbn/ item2705443/?site_locale=en_GB. – ISBN 978–0–521–19533–1 [Gal14] Gall, François Le: Powers of tensors and fast matrix multiplication. In: Nabeshima, Katsusuke (Hrsg.) ; Nagasaka, Kosaku (Hrsg.) ; Winkler, 84 Literaturverzeichnis Franz (Hrsg.) ; Szántó, Ágnes (Hrsg.): International Symposium on Symbolic and Algebraic Computation, ISSAC ’14, Kobe, Japan, July 23-25, 2014, ACM, 2014, 296–303 [Jac08] Jackson, Matthew O.: Social and Economic Networks. Princeton, NJ, USA : Princeton University Press, 2008. – ISBN 0691134405, 9780691134406 [Kle99] Kleinberg, Jon M.: Authoritative Sources in a Hyperlinked Environment. In: J. ACM 46 (1999), Nr. 5, 604–632. http://dx.doi.org/10. 1145/324133.324140. – DOI 10.1145/324133.324140 [LFR08] Lancichinetti, Andrea ; Fortunato, Santo ; Radicchi, Filippo: Benchmark graphs for testing community detection algorithms. In: Phys. Rev. E 78 (2008), Oct, 046110. http://dx.doi.org/10.1103/PhysRevE.78. 046110. – DOI 10.1103/PhysRevE.78.046110 [LS13] Leyffer, Sven ; Safro, Ilya: Fast response to infection spread and cyber attacks on large-scale networks. In: J. Complex Networks 1 (2013), Nr. 2, 183–199. http://dx.doi.org/10.1093/comnet/cnt009. – DOI 10.1093/comnet/cnt009 [Mei05] Meister, Andreas: Numerik linearer Gleichungssysteme. 2. Aufl. Vieweg, 2005. – ISBN 9–528–13135–7. – Mit Matlab-Implementierungen von Christof Vömel [MLH08] Magnien, Clémence ; Latapy, Matthieu ; Habib, Michel: Fast computation of empirically tight bounds for the diameter of massive graphs. In: ACM Journal of Experimental Algorithmics 13 (2008). http://dx.doi.org/10. 1145/1412228.1455266. – DOI 10.1145/1412228.1455266 [MR95] Motwani, Rajeev ; Raghavan, Prabhakar: Randomized Algorithms. Cambridge University Press, 1995. – ISBN 0–521–47465–5 [New10a] Newman, Mark: Networks: An Introduction. 2010 http://books.google. de/books/about/Networks.html?id=q7HVtpYVfC0C&pgis=1. – ISBN 0199206651 [New10b] Newman, Mark: Networks: an introduction. Oxford University Press, 2010 [SHS+ 16] Staudt, Christian L. ; Hamann, Michael ; Safro, Ilya ; Gutfraind, Alexander ; Meyerhenke, Henning: Generating Scaled Replicas of Real-World Complex Networks. In: International Workshop on Complex Networks and their Applications Springer International Publishing, 2016, S. 17–28 [SM16] Staudt, Christian L. ; Meyerhenke, Henning: Engineering Parallel Algorithms for Community Detection in Massive Networks. In: IEEE Trans. Parallel Distrib. Syst. 27 (2016), Nr. 1, 171–184. http://dx.doi.org/10. 1109/TPDS.2015.2390633. – DOI 10.1109/TPDS.2015.2390633 85 Literaturverzeichnis [SSM16] Staudt, Christian L. ; Sazonovs, Aleksejs ; Meyerhenke, Henning: NetworKit: A Tool Suite for Large-scale Complex Network Analysis. In: Network Science 4 (2016), Dec, Nr. 4, S. 508–530 [SW05] Schank, Thomas ; Wagner, Dorothea: Approximating Clustering Coefficient and Transitivity. In: Journal of Graph Algorithms and Applications 9 (2005), Nr. 2, S. 265–275 86 A. Grundlagen der linearen Algebra A.1. Matrizen, Vektoren und ihre Operationen Definition A.1. Ein Vektor v ∈ Rn heißt stochastisch, wenn gilt: vi ≥ 0 ∀ 1 ≤ i ≤ n n X vi = 1 i=1 Eine Matrixnorm kann mittels einer vorliegenden Vektornorm definiert werden, siehe bspw. Meister [Mei05, S. 19]. Wir benötigen hier nur zwei Normen: Definition A.2 (Matrixnormen). Die Spaltensummennorm und die Zeilensummennorm für eine Matrix A ∈ Rn×n sind definiert als: kAk1 = max k=1,...,n kAk∞ = max n X i=1,...,n |Aik | i=1 n X |Aik | (Spaltensummennorm) (A.1) (Zeilensummennorm) (A.2) k=1 A.2. Eigenwerte und -vektoren Definition A.3 (Eigenwert, Eigenvektor). Sei A eine symmetrische n × n-Matrix mit reellen Einträgen. Die Zahl λ heißt Eigenwert von A, wenn es einen Vektor z 6= 0 gibt, so dass Az = λz. Der Vektor z heißt Eigenvektor zum Eigenwert λ. Theorem A.4 (Eigenvektorbasis). Eine reelle symmetrische n × n-Matrix hat n unterschiedliche Eigenvektoren z (1) , . . . , z (n) ∈ Rn , die in Rn eine Basis bilden. Ferner gilt: z (i) ⊥ z (j) für alle 1 ≤ i 6= j ≤ n. Satz A.5. Der betragsmäßig größte Eigenwert ist nicht größer als eine induzierte Matrixnorm. Theorem A.6 (Perron-Frobenius). Sei A eine positive Matrix. Dann ist der größte Eigenwert λ1 von A positiv und einfach. Alle anderen Eigenwerte sind also betragsmäßig kleiner als λ1 . Außerdem existiert zu λ1 ein ebenfalls positiver Eigenvektor x. 87 A. Grundlagen der linearen Algebra Definition A.7 (Chebyshev-Ungleichung). Sei X eine Zufallsvariable mit Mittelwert µ und Streuung σ. Dann gilt für jedes r > 0: Pr(|X − µ| > rσ) < 1/r2 . A.3. NetworKit-Quellcodes A.4. Lösungen zu den Übungsaufgaben Die Lösungen für die Übungsaufgaben werden kooperierenden Lehrenden auf Anfrage zur Verfügung gestellt. Unter Kooperation verstehe ich dabei beispielsweise, dass eigene Aufgaben mit Lösungen zur Verfügung gestellt werden. Im öffentlich zugänglichen Dokument sind die Lösungen nicht verfügbar. 88