Salta al contenuto
Note per Studenti Esercizio - Stima degli elementi distinti con il k-esimo minimo

Esercizio - Stima degli elementi distinti con il k-esimo minimo

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 → (elementi distinti, kk-esimo minimo), 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 →.

Testo. Un flusso contiene dd valori distinti (con ripetizioni). Una funzione hash casuale manda ogni valore in un punto uniforme e indipendente di (0,1)(0,1) e l'algoritmo tiene i kk valori hash distinti più piccoli; con vkv_k il kk-esimo, la stima è d^=k−1vk\hat d=\frac{k-1}{v_k}.

  1. Dimostrare che il minimo V1V_1 di dd punti uniformi ha P(V1>t)=(1−t)dP(V_1>t)=(1-t)^d e E[V1]=1d+1E[V_1]=\frac1{d+1}. Verificare numericamente con d=50d=50.
  2. Con d=3d=3 e k=2k=2 dimostrare a mano che E[1V2]=3=dk−1E\bigl[\frac1{V_2}\bigr]=3=\frac d{k-1}, cioè che d^\hat d è non distorto.
  3. Perché k=1k=1 (d^=1V1−1\hat d=\frac1{V_1}-1) è una cattiva stima? Dare i quantili per d=50d=50.
  4. Quale kk garantisce uno scarto relativo ≈5%\approx5\%? Quanta memoria serve rispetto a un insieme esatto di 10510^5 identificatori da 88 byte?
  5. Con d=105d=10^5 stimare con una simulazione la probabilità di essere entro il 10%10\% e il 5%5\% del valore vero per k=100k=100 e k=402k=402.

Soluzione

1. Minimo. Il minimo supera tt se tutti i dd punti superano tt: P(V1>t)=(1−t)dP(V_1>t)=(1-t)^d per t∈[0,1]t\in[0,1]. Allora E[V1]=∫01P(V1>t) dt=∫01(1−t)d dt=1d+1.E[V_1]=\int_0^1P(V_1>t)\,dt=\int_0^1(1-t)^d\,dt=\frac1{d+1}. Per d=50d=50: 151=0,01961\frac1{51}=0{,}01961; la simulazione (200 000200\,000 prove) dà 0,019650{,}01965. Intuizione: dd punti dividono (0,1)(0,1) in d+1d+1 intervalli, in media di lunghezza 1d+1\frac1{d+1}, e il minimo è il primo.

2. Non distorsione per d=3d=3, k=2k=2. V2V_2 è il secondo più piccolo di 33 punti. Densità: si sceglie quale dei 33 punti sta in vv (33 modi), quale dei restanti 22 sta sotto (22 modi) e l'altro sta sopra: f(v)=3⋅2⋅v (1−v)=6v(1−v)f(v)=3\cdot2\cdot v\,(1-v)=6v(1-v) (controllo: ∫016v(1−v)dv=6(12−13)=1\int_0^16v(1-v)dv=6(\frac12-\frac13)=1). Quindi E[1V2]=∫011v 6v(1−v) dv=6∫01(1−v) dv=3=dk−1,E\Bigl[\frac1{V_2}\Bigr]=\int_0^1\frac1v\,6v(1-v)\,dv=6\int_0^1(1-v)\,dv=3=\frac d{k-1}, e E[d^]=(k−1)⋅3=3=dE[\hat d]=(k-1)\cdot3=3=d. Simulazione (10510^5 prove): media di 1/V21/V_2 pari a 3,0153{,}015.

3. Il caso k=1k=1. La densità di V1V_1 vicino a 00 vale dd, quindi E[1/V1]=∫1vd(1−v)d−1dv=∞E[1/V_1]=\int\frac1vd(1-v)^{d-1}dv=\infty: la media non esiste, la varianza non esiste, e una singola stima può essere enorme. Per d=50d=50 i percentili 5%5\%, 50%50\%, 95%95\% di 1V1−1\frac1{V_1}-1 valgono 16,216{,}2, 71,371{,}3, 977,7977{,}7 (vero: 5050): l'errore va da un fattore 33 in meno a un fattore 2020 in più. Con k≥3k\ge3 la media esiste e lo scarto relativo è circa 1k−2\frac1{\sqrt{k-2}}.

4. Scelta di kk. Si vuole 1k−2≤0,05  ⟺  k−2≥400\frac1{\sqrt{k-2}}\le0{,}05\iff k-2\ge400, cioè k=402\boxed{k=402}. Memoria: 402402 valori hash da 88 byte =3216=3216 byte, indipendenti da dd, contro 105⋅8=800 00010^5\cdot8=800\,000 byte per l'insieme esatto: 250250 volte meno. Per Chebyshev, con k=⌈2/ε2⌉+2k=\lceil2/\varepsilon^2\rceil+2 lo scarto relativo è ≈ε/2\approx\varepsilon/\sqrt2 e la stima è entro εd\varepsilon d con probabilità ≥12\ge\frac12; per una confidenza più alta si usa la mediana di copie indipendenti.

5. Simulazione (d=105d=10^5, 20002000 prove).

kk media d^\hat d scarto relativo entro 10%10\% entro 5%5\%
100100 100 222100\,222 0,10200{,}1020 68,4%68{,}4\% 36,9%36{,}9\%
402402 99 76099\,760 0,05000{,}0500 95,6%95{,}6\% 68,8%68{,}8\%

Gli scarti 0,10200{,}1020 e 0,05000{,}0500 coincidono con la formula (0,10100{,}1010 e 0,05000{,}0500). Con k=402k=402 la frazione entro 5%5\% è ≈68%\approx68\%, il valore di una gaussiana a una deviazione standard: lo scarto relativo 1k−2\frac1{\sqrt{k-2}} è proprio la deviazione standard di d^/d\hat d/d, non un limite sul caso peggiore.

Codice di verifica

python
import numpy as np

rng = np.random.default_rng(13)

d = 50
minimi = rng.random((200_000, d)).min(axis=1)
print(minimi.mean(), 1 / (d + 1), np.percentile(1 / minimi - 1, [5, 50, 95]))

v2 = np.sort(rng.random((100_000, 3)), axis=1)[:, 1]      # secondo più piccolo di 3 punti
print((1 / v2).mean())                                     # vicino a 3

D = 10 ** 5
for k in (100, 402):
    stime = np.array([(k - 1) / np.partition(rng.random(D), k - 1)[k - 1] for _ in range(2000)])
    print(k, stime.mean(), stime.std() / D, np.mean(abs(stime - D) <= 0.1 * D), np.mean(abs(stime - D) <= 0.05 * D))

Risultato: 0.01965 0.01961 [16.2 71.3 977.7], poi 3.015, poi le due righe della tabella: 100 100221.9 0.1020 0.6835 0.369 e 402 99760.2 0.0500 0.956 0.6875.

Versione ripasso

Teoria collegata