Esercizio - Contatore di Morris - distribuzione esatta, varianza e numero di contatori
Teoria: Algoritmi di streaming - campionamento di riserva e conteggio degli elementi distintiModello a flusso (un passaggio, memoria molto minore di n); campionamento di riserva (reservoir sampling) con dimostrazione per induzione; contatore di Morris (stima non distorta 2^X-1, varianza n(n-1)/2); elementi distinti: idea di Flajolet-Martin e stima del k-esimo minimo (k-1)/v_k; Count-Min sketch con garanzia (epsilon, delta) e dimensionamento w=e/epsilon, d=ln(1/delta).Algoritmi di streaming - campionamento di riserva e conteggio degli elementi distinti → (contatore di Morris), Momenti e deviazioni - Markov, Chebyshev e mediana randomizzataVar(ΣX_i) = ΣVar + 2ΣCov, e basta l'indipendenza a coppie perché la varianza si sommi. Chebyshev dà code polinomiali (collezionista: P(T ≥ nH_n + cn) ≤ π²/(6c²)); il metodo del secondo momento dà P(X=0) ≤ Var(X)/E[X]². Algoritmo della mediana: campione di n^(3/4) elementi, due estremi d e u a ±√n, ordinamento dei soli elementi tra d e u; fallisce con probabilità ≤ n^(-1/4) ed è Las Vegas con 2n + o(n) confronti.Momenti e deviazioni - Markov, Chebyshev e mediana randomizzata → (Chebyshev).
Testo. Il contatore di Morris tiene un intero , inizialmente ; a ogni evento incrementa con probabilità ; la stima è .
- Calcolare la distribuzione esatta di dopo e eventi. Verificare e .
- Dimostrare entrambe le formule per ogni .
- Con la deviazione standard è circa . Quanti contatori indipendenti, mediati, servono perché l'errore relativo sia con probabilità (Chebyshev)? Verificare con una simulazione.
- Variante con base : incremento con probabilità , stima , . Che garantisce, con un solo contatore, errore con probabilità ? Quanti bit servono per contare fino a , contro il conteggio esatto?
Soluzione
1. Distribuzioni esatte. Se l'incremento ha probabilità . Dopo evento con probabilità (da si incrementa con probabilità ).
- : da : con , con .
- : da (peso ): sale a con e resta con ; da (peso ): sale a con e resta con . Quindi , , . Stime : ; , .
- : , , , (si ottengono dalla distribuzione di : resta con , viene da , ecc.). Stime : ; (verificato con frazioni esatte per ).
2. Dimostrazione. Sia . Dato : Quindi e, con , : . Inoltre , da cui e . Controllo con : ✓.
3. Numero di contatori. La media di contatori indipendenti ha varianza . Chebyshev: Simulazione (). Un solo contatore ( prove): media , deviazione standard (teoria ; la media ha errore standard ). Media di contatori ( prove): media , deviazione standard (teoria ), e l'errore supera il in prova su : ben sotto il massimo garantito da Chebyshev, che è un limite largo.
4. Base . Per un solo contatore, Chebyshev: . Si impone : . Il contatore arriva a : per , , cioè bit, contro bit del conteggio esatto. Simulazione per , ( prove): media , deviazione standard (teoria ) e l'errore supera il nello dei casi. Con ( non controllato) servono bit: bit per , ma con deviazione standard .
Codice di verifica
import random
from fractions import Fraction
from statistics import mean, pstdev
def distribuzione(n):
d = {0: Fraction(1)}
for _ in range(n):
nuovo = {}
for x, p in d.items():
q = Fraction(1, 2 ** x) # probabilità di incremento
nuovo[x + 1] = nuovo.get(x + 1, 0) + p * q
nuovo[x] = nuovo.get(x, 0) + p * (1 - q)
d = nuovo
return d
for n in (3, 4):
d = distribuzione(n)
m = sum(p * (2 ** x - 1) for x, p in d.items())
v = sum(p * (2 ** x - 1) ** 2 for x, p in d.items()) - m * m
print(n, {x: str(p) for x, p in sorted(d.items()) if p}, m, v)
def morris(n, a=1.0):
X = 0
for _ in range(n):
if random.random() < (1 + a) ** -X:
X += 1
return ((1 + a) ** X - 1) / a
random.seed(2)
uno = [morris(1000) for _ in range(5000)]
print(mean(uno), pstdev(uno))
m500 = [mean(morris(1000) for _ in range(500)) for _ in range(100)]
print(mean(m500), pstdev(m500), mean(abs(v - 1000) > 100 for v in m500))
v = [morris(1000, 0.002) for _ in range(3000)]
print(mean(v), pstdev(v), mean(abs(x - 1000) > 100 for x in v))Risultato: per e le distribuzioni del punto 1 con media 3 e varianza 3, poi media 4 e varianza 6; poi tre righe di simulazione: 989.39 678.68 (un contatore), 1001.77 30.88 0.01 (media di contatori) e 1000.76 32.07 0.00133 (base ), cioè media, deviazione standard e frazione di errori oltre il citate nei punti 3 e 4.
Versione ripasso
- Distribuzioni. : con , stime , , . : , stime , , (Algoritmi di streaming - campionamento di riserva e conteggio degli elementi distintiModello a flusso (un passaggio, memoria molto minore di n); campionamento di riserva (reservoir sampling) con dimostrazione per induzione; contatore di Morris (stima non distorta 2^X-1, varianza n(n-1)/2); elementi distinti: idea di Flajolet-Martin e stima del k-esimo minimo (k-1)/v_k; Count-Min sketch con garanzia (epsilon, delta) e dimensionamento w=e/epsilon, d=ln(1/delta).Algoritmi di streaming - campionamento di riserva e conteggio degli elementi distinti →).
- Dimostrazione. : , ; , , .
- Media di contatori. (Chebyshev, Momenti e deviazioni - Markov, Chebyshev e mediana randomizzataVar(ΣX_i) = ΣVar + 2ΣCov, e basta l'indipendenza a coppie perché la varianza si sommi. Chebyshev dà code polinomiali (collezionista: P(T ≥ nH_n + cn) ≤ π²/(6c²)); il metodo del secondo momento dà P(X=0) ≤ Var(X)/E[X]². Algoritmo della mediana: campione di n^(3/4) elementi, due estremi d e u a ±√n, ordinamento dei soli elementi tra d e u; fallisce con probabilità ≤ n^(-1/4) ed è Las Vegas con 2n + o(n) confronti.Momenti e deviazioni - Markov, Chebyshev e mediana randomizzata →). Simulato: un contatore sd (teoria ); contatori sd (teoria ), errore in prova su .
- Base . , per ; : , bit contro . Simulato: sd (teoria ), errore nello .
- Errori tipici. Stimare con (distorta di ) invece di ; credere che un contatore solo basti; dimenticare che l'errore relativo è costante () con .