7.1 Verschiedene Elemente in einem Datenstrom zählen
Formale Problembeschreibung
Die Eingabe ist ein Datenstrom aus Elementen aus einem
Universum . Im obigen Beispiel war die Menge aller
theoretisch möglichen IP-Adressen, also . Falls es sich um
IPv6-Adressen handelt, wäre . Im Datenstrom kann ein Element
mehrfach auftreten, und unser Ziel ist es, die Anzahl verschiedener Items zu zählen. Etwas
formular:
Falls Elemente mehrfach im Datenstrom vorkommen, gilt . Unsere Maschine liest die
Eingabedaten
nacheinander in zeitlicher Reihenfolge, kann also im Gegensatz zu einer Turing-Maschine nicht
zurückspulen oder alte Items noch einmal betrachten. Sie hat einen internen Speicher,
der typischerweise extrem klein im Vergleich zu und ist.
Ziel ist es, nach Ende
des Datenstroms einen Schätzwert auszugeben, der nicht allzuweit entfernt von ist.
Wir interessieren uns in diesem Zusammenhang ausschließlich für den Speicherplatz, den die
Maschine benötigt, nicht für die Laufzeit ihrer Berechnungen. Sie ist also im Prinzip
computationally unbounded. Um es noch formaler zu machen: die Maschine
ist, ähnlich einem endlichen Automaten,
definiert durch eine Funktion ; die Interpretation
ist, dass das nächste Eingabe-Item ist und der derzeitige Speicherinhalt
der Maschine; der Wert ist dann der Speicherinhalt im nächsten Schritt.
Der benötigte Speicherplatz in Bits ist somit . Ein Unterschied zu
endlichen Automaten ist, dass und auch von und abhängen dürfen (wir gehen
davon aus, dass die Maschine zumindest eine obere Schranke der Datenstromlänge kennt).
Wir interessieren uns also primär für den Speicherplatz und nicht dafür, wie
komplex die Berechnung von ist. In der Praxis ist aber meist eine
recht einfache Funktion, so dass diese Freiheit keine bösen Konsequenzen hat.
Exakte aber ineffiziente Algorithmen
Unsere Maschine kann natürlich einfach zu jedem Zeitpunkt die Menge
speichern und Duplikate entfernen. Dafür braucht sie
Bits: ist eine obere Schranke für die Größe
von und ist die Anzahl der Bits, die wir brauchen um ein Item
aus dem Universum zu speichern.
Alternativ können wir uns eine boolesche Tabelle der Größe anlegen, alles mit
False initialisieren und dann bei Input-Item die entsprechende
Zelle auf True setzen. Dafür benötigen wir Bits.
Beobachtung 7.1.1
Wir können mit Bits Speicherplatz die Anzahl der verschiedenen
Items exakt berechnen.
Effiziente approximative Algorithmen
Ein Speicherplatzbedarf gilt in diesem Modell als ineffizient.
Unser Goldstandard ist . Dies erlaubt uns, eine konstante
Anzahl von Wörtern - - sowie zum Beispiel einen Schrittzähler -
- zu speichern. Die Anzahl verschiedener Items können wir so nicht mehr exakt
berechnen (dies ist selbst ein Theorem, dessen Beweis den Rahmen dieses Vorlesungsskripts
sprengen würde; man benötigt hierfür Techniken der Kommunikationskomplexität).
Wenn wir Randomisierung zulassen, können wir zumindest mit großer Zuverlässigkeit
einen anständigen Schätzwert
für , also die Anzahl verschiedener Elemente im Datenstrom berechnen.
Der Algorithmus von Flajolet und Martin
Ich beschreibe zuerst eine impraktikable aber leichter zu analysierende Version
des Algorithmus.
Sei die Menge der verschiedenen Items. Jedes in unserem
Datenstrom ist also eines dieser . Wir wählen eine
zufällige Funktion und speichern diese für die
Dauer des Datenstroms. Dies ist natürlich nicht praktikabel, weil wir dafür
Bits bräuchten (Sie können sich vorstellen, wir legen eine Tabelle
der Größe an; eine Zelle muss nun den Wert speichern, wofür sie wiederum
Bits braucht; etwas informationstheoretischer: es gibt Funktionen
und somit braucht man Bits, um eine zu codieren).
Wir ignorieren diese Bedenken vorerst, tun so, als hätten wir
gespeichert und schauen uns an, was mit dem Datenstrom macht:
Sehen wir uns das Endergebnis noch einmal an:
Links sehen Sie am Beispiel die Werte . Rechts
die Bilder . Da eine zufällige Funktion ist,
sind diese Werte gleichverteilt und unabhängig. Setzen wir
. Wir haben also unabhängige Zufallsvariable ,
von denen jede in gleichverteilt ist. Machen wir nun eine Bierdeckelrechnung:
diese Zufallszahlen teilen in Intervalle ein, die im Schnitt
Zahlen haben. Also besteht auch das linkeste Intervall
im Schnitt aus
Zahlen und somit ist
Wenn wir nach auflösen, erhalten wir
Den Erwartungswert von kennen wir nicht;
den Wert allerdings können wir einfach
berechnen, indem sich unsere Maschine zu jedem Zeitpunkt das Minimum der
gesehenen Elemente (bzw. deren Bilder unter ) merkt.
Hier nun also unser Algorithmus:
def FlajoletMartinImpraktikabel:
Wähle zufällig
# dies ist impraktikabel, weil dies Bits Speicher
benötigt.
for im Datenstrom:
return .
Das folgende Theorem besagt nun, dass mit guter Wahrscheinlichkeit
weder zu klein noch zu groß ist.
Theorem 7.1.2 Für den Schätzwert
FlajoletMartinImpraktikabel gilt:
.
.
Beweis.
Für Punkt 1 sehen wir, dass
In Worten: das Minimum von Zahlen ist kleiner als eine Schranke genau dann,
wenn mindestens eine der Zahlen kleiner als diese Schranke ist. Wir rechnen nun
weiter:
Zur Erinnerung: der Union Bound besagt, dass für zwei Ereigbnisse und gilt. Dies lässt sich unmittelbar von zwei
auf Ereignisse verallgemeinern.
Für ein festes können wir wie folgt bestimmen: der Wert
ist ja und ist somit ein zufälliger Wert in .
Die Wahrscheinlichkeit, dass er kleiner als ist, ist
Wir setzen das in den obigen Union Bound ein und erhalten
wie behauptet. Somit ist Punkt 1 gezeigt. Für Punkt 2 gehen wir anfangs ähnlich vor:
In Worten: das Minimum von Zahlen ist größer als eine Schranke, wenn jede
diese Zahlen größer als die Schranke ist. Somit gilt
ä
Für festes schätzen wir wie folgt ab:
und somit
wobei wir in der letzten Ungleichung die Tatsache verwendet haben.
Den Algorithmus praktikabel machen: paarweise unabhängige Zufallsvariable
Statt zufällig zu wählen, wählen wir
es pseudozufällig. Hierfür wählen wir eine Primzahl
und betrachten die Menge als unser neues Universum.
Wir wählen zwei zufällige Zahlen gleichverteil und unabhängig und setzen
Der Rest des Algorithmus ist identisch:
def FlajoletMartin:
Wähle eine Primzahl und setze .
Wähle und definiere
for im Datenstrom:
return .
Zur Erinnerung: ist der Rest, der bei der Division von durch
übrigbleibt. Wenn zwei Zahlen und modulo den gleichen Rest
ergeben, dann schreiben wir und lesen " ist äquivalent zu modulo ".
Dies gilt genau dann, wenn , wenn also ein Teiler der Differenz ist.
Wenn wir jetzt den Beweis von Theorem 7.1.2
durchgehen, sehen wir, dass dieser spätestens bei dem Argument der Unabhängigkeit scheitern
wird. Die Werte sind nicht mehr unabhängig.
Ist zumindest gleichverteilt?
Lemma 7.1.3
Sei . Dann ist der
Wert gleichverteilt in .
Beweis.
Um zu zeigen, dass gleichverteilt in ist, müssen wir
zeigen, dass für jedes feste gilt, dass .
Es gilt
Wieviele Möglichkeiten gibt es, für die gilt?
Für jede Wahl von gibt es genau eine Möglichkeit für , nämlich
eben . In anderen Worten: die Gleichung in den
Unbekannten und hat Lösungen. Insgesamt gibt es
für genau Möglichkeiten; viele davon erfüllen , und
somit gilt
Wir sehen: ist gleichverteilt in .
Das nächste Lemma zeigt, dass die paarweise unabhängig
sind. Hier werden wir benötigen, dass eine Primzahl ist.
Lemma 7.1.4 Seien zwei
verschiedene Werte in . Dann sind gleichverteilt in
und unabhängig.
Beweis.
Wir müssen nun zeigen, dass das Paar gleichverteilt in ist.
Dass also für jedes gilt:
. Wir sehen,
dass genau dann gilt, wenn
Dies ist ein Gleichungssystem mit zwei Gleichungen und zwei Unbekannten und .
Wir können nun das Gleichungssystem in Matrix-Vektor-Form schreiben
Die Matrix hat vollen Rang und somit
hat das Gleichungssytem genau eine Lösung.
Um das Argument mit der Matrix und dem vollen Rang zu verstehen, müssen Sie sich
(1) an Ihre lineare Algebra erinnern und wahrscheinlich auch (2)
davon überzeugen, dass alles, was Sie in linearer Algebra mit reellen
Zahlen gemacht haben, auch funktioniert, wenn Sie nun mit Zahlen modulo
zu tun haben.
Ich möchte allerdings in diesem Skript so wenig Grundlagen wie möglich
voraussetzen. Daher werde ich im
nächsten Teilkapitel den Beweis "zu Fuß"
ablaufen.
Nehmen wir nun aber für erste
Lemma 7.1.4 als gegeben an.
Theorem 7.1.5
Für den Schätzwert
FlajoletMartin gilt:
.
.
Beweis.
Punkt 1 geht genau so wie der Beweis von
Theorem 7.1.2, da
wir hierfür nur benötigen, dass für jedes feste der Wert
gleichverteilt in ist. Für Punkt 2 werden wir benötigen, dass die
paarweise unabhängig sind. Fast genau
so wie beim Beweis
von Theorem 7.1.2 gilt
Wir können die Wahrscheinlichkeit des Schnitts der Ereignisse nicht
per Unabhängigkeit abschätzen und gehen daher einen alternativen Weg. Wir
führen Indikatorvariable ein:
Des Weiteren setzen wir .
Wir sehen: tritt genau dann ein,
wenn kein in den Bereich fällt; wenn also eintritt.
Als erstes berechnen wir den Erwartungswert von :
Hierfür reicht ein Union Bound leider nicht aus. Wir brauchen
die sogenannte Tschebyschow-Ungleichung.
Markov-Ungleichung und Tschebyschow-Ungleichung
Lemma 7.1.6
Sei eine Zufallsvariable, die Werte in annimmt. Dann gilt
für jedes :
Als Beispiel: höchstens ein drittel aller Deutschen haben ein Einkommen, dass
das deutsche Durchschnittseinkommen um das Dreifache oder mehr übersteigt.
Die Markow-Ungleichung ist oft eine sehr schwache Schranke.
Die Durchschnittshöhe einer deutschen Frau liegt laut
https://en.wikipedia.org/wiki/Average_human_height_by_country
bei circa 1,66 Metern Zentimetern. Lauf Markow-Ungleichung
ist höchstens jede zweite deutsche Frau größer als 3,32 Meter.
Wahr, aber nicht sehr aussagekräftig.
Beweis von Reference "lemma-markov-inequality" not found. Go to put-all-in-one-page.html and read the instructions.
Wir beschränken uns auf endliche Wahrscheinlichkeitsräume . Jedes
Element hat eine Wahrscheinlichkeit .
Die Zufallsvariable ist nun eine Funktion
Der Erwartungswert von ist definiert als die Summe
Wir teilen in zwei Teile auf, je nachdem, ob groß ist oder klein:
ß
Wir teilen nun die Summe () auf:
ßßßßß
Zusammenfassend erhalten wir und somit
ß
Die Markow-Ungleichung hat den Vorteil, dass sie auf jede nicht-negative Zufallsvariable
anwendbar ist. Der Nachteil ist, dass sie oft sehr schwach ist, also keine
guten Schranken liefert, und nichts über Wahrscheinlichkeiten der Form
aussagt. Sie beschränkt nur Abweichungen nach oben,
nicht nach unten. Um genauere Schranken zu beweisen, können wir
die Varianz der Zufallsvariable betrachten.
Varianz. Sei eine Zufallsvariable, die reelle Werte (gerne auch negative)
annimmt. Sei ihr Erwartungswert. Um zu messen, wie sehr typischerweise
von abweicht, betrachten wir den Wert ; dieser ist immer positiv, und somit ist
auch
die Varianz von , immer positiv. Wenn wir die Varianz einer
Zufallsvariable kennen und diese klein ist, so können wir
Abschätzungen angeben, die genauer sind als die Markow-Ungleichung:
Tschebyschow-Ungleichung 7.1.7 Sei eine
Zufallsvariable und . Dann gilt
Beweis.
Die Ungleichung gilt genau dann, wenn auch
gilt. Sei nun . Dies ist
wiederum eine Zufallsvariable, und es gilt nach Definition
der Varianz. Wir wenden jetzt die Markow-Ungleichung auf an:
wie behauptet.
Weiterhin ist die Varianz nützlich, wenn die Zufallsvariable die Summe
unabhängig (oder auch paarweise unabhängiger) Zufallsvariablen ist. In diesem
Falle ist die Varianz üblicherweise klein. Dies entspricht der Intuition:
wenn wir unabhängige Zufallszahlen aufaddieren, sollten sich die Abweichungen
in den meisten Fällen in etwa ausgleichen. Wir beginnen mit einer
alternativen Formel für :
Beobachtung 7.1.8.
Beweis.
Sei . Wir rechnen:
Wie behauptet.
Lemma 7.1.9
Seien paarweise unabhängige Zufallsvariable und .
Dann gilt
Beweis.
Sei und . Wir berechnen als erstes
:
Da die paarweise unabhängig sind, gilt für . Für gilt . Somit ist
Und somit gilt , wie
behauptet.
Wenden wir diese Maschinerie auf unsere Zufallsvariablen an. Zur Erinnerung: diese
haben wir definiert als