Esercizio - Campionamento di riserva su un flusso di cinque elementi
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 → (reservoir sampling), Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →.
Testo. Il campionamento di riserva con legge un flusso : tiene ; per estrae uniforme in e, se , mette nello slot .
- Con e flusso mostrare che ogni elemento è il campione finale con probabilità e simulare a mano la sequenza di estrazioni , , .
- Con calcolare, passo per passo, la probabilità con cui ogni elemento è nel campione dopo elementi, e la probabilità di ciascuna delle coppie finali.
- Un programmatore usa invece la regola: l'elemento entra con probabilità e sostituisce uno slot scelto a caso. Calcolare le probabilità di inclusione per , . È uniforme?
- Quante sostituzioni fa l'algoritmo in media su un flusso di elementi? Calcolare per , .
Soluzione
1. Caso . L'elemento () sostituisce il campione se , con probabilità . sopravvive se i passi non lo sostituiscono: . entra con e sopravvive ai passi : . : . : . Tutti (in generale ).
Sequenza , , . Passo : , si scarta e il campione resta . Passo : , sostituisce: campione . Passo : , scarta . Campione finale: .
2. Caso , . Dopo il campione è .
- Passo ( ciascuno con probabilità ): nulla, campione ; : ; : . Ogni elemento compare in due casi su tre: con , .
- Passo (): lasciano il campione, inseriscono . Le coppie possibili hanno ciascuna probabilità : (da con : ), (da e con : ciascuna), e le tre coppie con : , e , ciascuna con probabilità . Inclusione: per ogni elemento.
- Passo (): entra con probabilità ; ogni vecchio elemento nel campione () è espulso con probabilità (il suo slot è esattamente uno dei valori di ), quindi resta con . Le coppie finali hanno probabilità ciascuna: l'enumerazione di tutti gli esiti (le configurazioni ordinate per slot si ripartiscono sulle coppie) lo conferma.
3. L'algoritmo "entra con ". Con i nuovi elementi entrano con probabilità , nello slot o con probabilità ciascuno. Un elemento già presente resta con probabilità a ogni passo (non entra nulla, oppure entra nell'altro slot). Il calcolo esatto dà Non è uniforme: gli ultimi elementi sono favoriti ( contro ; per un flusso lungo i primi sparirebbero come ). Il fattore che decresce con è essenziale: il uniforme in rende sempre meno probabile l'ingresso di un elemento nuovo, compensando il fatto che gli elementi vecchi hanno già avuto più occasioni di essere espulsi.
4. Numero di sostituzioni. Il passo sostituisce con probabilità , quindi per la linearità Per , : sostituzioni su elementi: costo di memoria e circa scritture. Per la formula dà e simulazioni danno media (la deviazione standard teorica è circa ).
Codice di verifica
from fractions import Fraction
import random
def passo(stati, i, k):
nuovo = {}
for s, p in stati.items():
for j in range(1, i + 1):
t = s
if j <= k:
t = list(s); t[j - 1] = i; t = tuple(t) # x_i prende lo slot j
nuovo[t] = nuovo.get(t, 0) + p * Fraction(1, i)
return nuovo
stati = {(1, 2): Fraction(1)}
for i in (3, 4, 5):
stati = passo(stati, i, 2)
print(i, {x: str(sum(p for s, p in stati.items() if x in s)) for x in range(1, i + 1)})
coppie = {}
for s, p in stati.items():
coppie[frozenset(s)] = coppie.get(frozenset(s), 0) + p
print(len(stati), sorted(set(map(str, coppie.values()))), len(coppie))
random.seed(1)
def sostituzioni(N, k):
return sum(random.randrange(1, i + 1) <= k for i in range(k + 1, N + 1))
r = [sostituzioni(10 ** 5, 100) for _ in range(100)]
print(sum(r) / len(r), 100 * (sum(1 / i for i in range(101, 10 ** 5 + 1))))Risultato: le probabilità di inclusione 2/3, 1/2, 2/5 (per ogni elemento), 13 ['1/10'] 10, e infine 687.43 690.2768... (media simulata e valore teorico delle sostituzioni).
Versione ripasso
- , . è il campione finale con probabilità per ogni (esempio: estrazioni , , danno ) (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 →).
- , . Dopo elementi inclusione (campioni con ); dopo : , sei coppie con ; dopo : , dieci coppie con (i vecchi restano con , il nuovo entra con ). Le configurazioni ordinate per slot si ripartiscono sulle coppie.
- Regola sbagliata (entra con in uno slot a caso): inclusioni : non uniforme, favorisce gli ultimi; un vecchio resta con per passo.
- Costo. : per , ; per (simulato ), per la linearità (Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →).
- Errori tipici. Usare probabilità costante di ingresso; estrarre in invece di ; scambiare l'uniformità degli elementi con quella dei sottoinsiemi (vale anche la seconda).