19.1 Bayesi frissítés rácson

19.1.1 Cél és konkrét helyzet

A Northstar kísérleti projekt mintájára egy szintetikus Bernoulli-kimenetet elemzünk: a kezelési ág egy kis kohorszában a 7 napos konverzió (conversion_7d) értéke 0 vagy 1. A megfigyelési egység ügyfél, az adat-összegzés egyetlen eseménysorozatot ad:

n=15,k=6.n = 15,\qquad k = 6.

Itt kk a konverziók száma, nn a kezelt ügyfelek száma. A kérdéses paraméter pp: a kezelési ág konverziós valószínűsége, p∈[0,1]p \in [0,1] dimenzió nélküli valószínűség. A cél a pp feletti normalizált posterior-sűrűség kiszámítása rácsos közelítéssel, két eltérő priorral. Előzetes becslés a Paraméter, becslő és likelihood maximum likelihood gondolatából: a mintaarány k/n=0.4k/n = 0.4, tehát a posterior módusz 0.40.4 körül várható; flat priorral a posterior várható érték 0.40.4-nél kissé nagyobb lesz, mert a balra korlátos tartomány aszimmetriája felfelé húz.

Az alábbi kódok futtathatók, de az itt közölt numerikus kimenetek elméletileg várt, szemléltető értékek; e szöveg írásakor nem futott Python-kód. A tanuló saját futtatása az ellenőrzés.

19.1.2 Fogalmi magyarázat: prior, likelihood, posterior, normalizálás, predictive

Prior (a priori eloszlás). A prior π(p)\pi(p) a pp paraméter feletti bizonytalanságunkat fejezi ki az adat megtekintése előtt. Sűrűség: π(p)≥0\pi(p) \ge 0, ∫01π(p)dp=1\int_0^1 \pi(p)\,dp = 1. Két példát használunk:

A Beta(α,β)(\alpha,\beta) prior alakja:

f(p)=Γ(α+β)Γ(α)Γ(β)pα−1(1−p)β−1,p∈[0,1],α,β>0.f(p) = \frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)} p^{\alpha-1}(1-p)^{\beta-1}, \qquad p \in [0,1],\ \alpha,\beta > 0.

Itt α+β\alpha+\beta a prior „mintanagyság-ereje”: nagyobb összeg szűkebb, határozottabb priort jelent.

Likelihood. A D=(k,n)D = (k,n) Bernoulli-mintához tartozó likelihood a pp függvénye, ahol az adat rögzített:

L(p;D)=pk(1−p)n−k.L(p; D) = p^k (1-p)^{n-k}.

A teljes binomiális valószínűség ennek (nk)\binom{n}{k}-szorosa. A (nk)\binom{n}{k} tényező pp-től független konstans, ezért a posterior normalizálásánál kiesik; elég a likelihood-magot, pk(1−p)n−kp^k(1-p)^{n-k}-t használni. A likelihood nem valószínűségi eloszlás pp felett: integrálja általában nem 1. Az n=15n=15, k=6k=6 adatnál a kernel p=0.4p=0.4-nél körülbelül 4.13⋅10−54.13 \cdot 10^{-5}, p=0.5p=0.5-nél 3.05⋅10−53.05 \cdot 10^{-5}; a hányados 1.351.35, tehát az adat önmagában a 0.40.4-et jobban támogatja, mint a 0.50.5-et.

Posterior (a posteriori eloszlás). Bayes tétele alapján a posterior-sűrűség arányos a prior és a likelihood szorzatával:

π(p∣D)=π(p)L(p;D)Z,Z=∫01π(p)L(p;D)dp.\pi(p \mid D) = \frac{\pi(p)L(p; D)}{Z}, \qquad Z = \int_0^1 \pi(p)L(p; D)\,dp.

A ZZ normalizáló konstans, más néven marginális likelihood / evidence. Az itt használt kernel esetén ZZ a kernel-evidence; a teljes binomiális evidenciához a (nk)\binom{n}{k} tényezőt is meg kell szorozni.

Normalizálás (normalization). A folytonos integrált egy G=1001G=1001 pontból álló, 00 és 11 közötti egyenletes rácson közelítjük:

grid=[p0,p1,…,pG−1],pj=jΔp,Δp=0.001.\text{grid} = [p_0, p_1, \ldots, p_{G-1}], \qquad p_j = j \Delta p, \quad \Delta p = 0.001.

Minden rácspontban kiszámítjuk az unnormalizált posterior értéket:

unnormj=π(pj)pjk(1−pj)n−k.\text{unnorm}_j = \pi(p_j)\, p_j^k(1-p_j)^{n-k}.

A normalizáló konstans trapézszabállyal közelítve:

Z≈∑j=0G−2unnormj+unnormj+12Δp.Z \approx \sum_{j=0}^{G-2} \frac{\text{unnorm}_j + \text{unnorm}_{j+1}}{2} \Delta p.

A normalizált posterior:

πj=unnormjZ.\pi_j = \frac{\text{unnorm}_j}{Z}.

Ekkor ∑πjΔp≈1\sum \pi_j \Delta p \approx 1. A normalizálás nélkül görbe formája azonos, de a magasság nem sűrűség, és a posterior várható érték vagy intervallum hibásan súlyozott értéket adna.

Predictive (posterior prediktív eloszlás). Egy új, a mintától független kezelt ügyfél sikerének valószínűsége, feltéve a modellt és a múlt adatot:

P(Ynew=1∣D)=∫01pπ(p∣D)dp=𝔼[p∣D].P(Y_{\text{new}} = 1 \mid D) = \int_0^1 p\, \pi(p \mid D)\, dp = \mathbb{E}[p \mid D].

Rácson ez a posterior várható értéke: trapezoid(grid * posterior, grid). A prediktív valószínűség tehát nem a 0/10/1 kimenet, hanem a siker valószínűségének posterior-átlaga. Ez a mennyiség a paraméterbizonytalanságot átlagolja ki, nem az egyedi YnewY_{\text{new}} zaját adja meg; utóbbihoz a teljes posterior prediktív eloszlás tartozik.

A posterior credible interval (bayesi hitelességi intervallum) adott DD és prior mellett a posterior tömeg 95%-át tartalmazza. Ez más értelmezés, mint a Standard error és konfidenciaintervallum alfejezetbeli konfidenciaintervallum ismételt mintavételi lefedettségi állítása.

19.1.3 Teljes minimális munkapélda

A kód Python 3.12-t, NumPy-t és SciPy-t igényel; a lab projektgyökeréből uv sync után uv run python s073_grid_bayes.py módon futtatható. Ha már van lock, használjon uv run --locked-ot. A kód egyszerre számítja a két priort és a minta növelésének hatását.

import numpy as np
from scipy.integrate import trapezoid

grid = np.linspace(0.0, 1.0, 1001)
step = grid[1] - grid[0]

def kernel(p_grid, k, n):
    return p_grid**k * (1.0 - p_grid)**(n - k)

def posterior_on_grid(prior, k, n):
    unnorm = prior * kernel(grid, k, n)
    z = trapezoid(unnorm, grid)
    return unnorm / z

def posterior_mean(post):
    return trapezoid(grid * post, grid)

def equal_tail_interval(post, alpha=0.05):
    # Trapézonkénti területekből CDF, majd lineáris kvantiliskeresés.
    areas = 0.5 * (post[:-1] + post[1:]) * np.diff(grid)
    cdf = np.concatenate(([0.0], np.cumsum(areas)))
    cdf[-1] = 1.0
    lo = np.interp(alpha / 2, cdf, grid)
    hi = np.interp(1.0 - alpha / 2, cdf, grid)
    return lo, hi

flat_prior = np.ones_like(grid)
skeptical_prior = 4.0 * (1.0 - grid)**3  # Beta(1,4), normált sűrűség

for name, prior in [("flat", flat_prior), ("skeptical Beta(1,4)", skeptical_prior)]:
    post = posterior_on_grid(prior, 6, 15)
    print(name,
          "mean=%.6f" % posterior_mean(post),
          "95% CI=", tuple(round(v, 4) for v in equal_tail_interval(post)),
          "normalization_error=%.1e" % (trapezoid(post, grid) - 1.0))

print("\nA minta növelése, rögzített k/n = 0.4 aránnyal:")
for k, n in [(6, 15), (24, 60), (240, 600)]:
    mean_flat = posterior_mean(posterior_on_grid(flat_prior, k, n))
    mean_skep = posterior_mean(posterior_on_grid(skeptical_prior, k, n))
    print(f"n={n:4d}  k={k:3d}  flat_mean={mean_flat:.4f}  skeptical_mean={mean_skep:.4f}")

# A posterior görbék ábrája, ha vizuális ellenőrzés is kell:
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7, 4))
for name, prior in [("flat", flat_prior), ("skeptical Beta(1,4)", skeptical_prior)]:
    post = posterior_on_grid(prior, 6, 15)
    ax.plot(grid, post, label=name)
ax.set_xlabel("p: konverziós valószínűség")
ax.set_ylabel("Posterior-sűrűség")
ax.set_title("n=15, k=6: két prior posteriorja")
ax.legend()
plt.tight_layout()
plt.show()

A kód kimenete analitikusan ellenőrizhető:

A posterior várható értékek:

prior posterior várható érték
flat Beta(1,1)(1,1) Beta(7,10)(7,10) 7/17≈0.41187/17 \approx 0.4118
szkeptikus Beta(1,4)(1,4) Beta(7,13)(7,13) 7/20=0.357/20 = 0.35

A flat prior posterior módusza (7−1)/(17−2)=0.4(7-1)/(17-2)=0.4, pontosan a mintaarány. A szkeptikus prior módusza (7−1)/(20−2)=1/3≈0.333(7-1)/(20-2)=1/3 \approx 0.333; a prior a 0.20.2 felől húzza felfelé az adat 0.40.4-ét.

A minta növelése rögzített k/n=0.4k/n=0.4 arány mellett:

n k flat posterior várható értéke szkeptikus posterior várható értéke
15 6 7/17≈0.41187/17 \approx 0.4118 7/20=0.357/20 = 0.35
60 24 25/62≈0.403225/62 \approx 0.4032 25/65≈0.384625/65 \approx 0.3846
600 240 241/602≈0.4003241/602 \approx 0.4003 241/605≈0.3983241/605 \approx 0.3983

A két prior közötti különbség n=15n=15-nél 0.06180.0618, n=600n=600-nál már csak 0.0020.002 körüli; a minta növekedésével a prior hatása eltűnik, de a priorválasztás továbbra is explicit marad.

19.1.4 Eredmény értelmezése

Kézi kontroll: a Beta(7,10)(7,10) és Beta(7,13)(7,13) sűrűség integrálja 1, tehát a rácsos posterior normalizáltsága az 11-től való eltérés ≈10−9\approx 10^{-9} nagyságrendben várható. Az unnormalizált posterior shape-e a griddel egyező (1001,), dtype float64, minden érték nemnegatív, a tömeg a 00–0.80.8 tartományban koncentrálódik. A posterior módusz a grid finomságától függően a maximum indexénél kereshető; a lineáris kvantilisintervallum pontosságát a step = 0.001 rács korlátozza, tehát a credible interval határait legfeljebb néhány ezrelék hibával érdemes jelenteni.

Fontos: ez a posterior a kezelési ág konverziós valószínűségét becsli, nem önmagában az oksági hatást. A kontrollággal való ATE-összehasonlítás a randomizálás és az Oksági cél és megfigyelési torzítás alfejezetbeli azonosítási feltételek témája. A posterior paraméterbizonytalanság, a prediktív valószínűség a paraméter átlaga egy új ügyfélnél, a szimulációs hiba pedig a Predikciós, paraméter- és Monte Carlo intervallum alfejezetben bevezetett harmadik bizonytalanságfajta; itt nincs Monte Carlo-ismétlés, ezért szimulációs standard hibát nem számolunk.

Rácsközelítés: a posterior rácson számított diszkrét súlyait a teljes összeggel kell normalizálni; a rács felbontása és szélei ellenőrizendők. A priori megválasztása nem puszta technikai részlet, ezért érzékenységi vizsgálat ajánlott.

19.1.5 Feladatok

  1. Értelmezés: A flat priorral kapott posterior Beta(7,10)(7,10) módusza 0.40.4, várható értéke 0.41180.4118. Miért tér el a kettő, és miért a mintaarány a módusz? Indokolja a Beta-módusz és -átlag képletéből.

  2. Implementálás: Írjon posterior_summary(prior, k, n) függvényt, amely a fenti grid-et használja, normalizálja a posterior-t, és visszaad egy (posterior, mean, mode, lo, hi) rendezett ötöst, ahol mode a legnagyobb posterior-sűrűségű rácspont, lo és hi a 95%-os equal-tailed intervallum. Ellenőrizze a normalizáltságot |integrál−1|<10−8| \text{integrál} - 1 | < 10^{-8} hibahatárral. Futtassa k=3,n=10k=3,\ n=10, flat priorral; adja meg a várt mean és mode értéket.

  3. Hibadiagnózis: Egy elemző a k=6,n=15k=6,\ n=15, flat prior esetben így „átlagol”:

    unnorm = flat_prior * kernel(grid, 6, 15)
    mean_wrong = trapezoid(grid * unnorm, grid)
    evidence_wrong = trapezoid(unnorm, grid)

    Mi a két hiba? Miért nem a posterior várható érték a mean_wrong, és miért nem teljes binomiális evidence az evidence_wrong? Számítsa ki a javítást, és adja meg a flat priorral a teljes binomiális marginális likelihood pontos értékét n=15,k=6n=15,\ k=6 esetén.

  4. Megváltoztatott prior / transzfer: Ugyanaz a minta, n=15,k=6n=15,\ k=6, de a prior most optimista Beta(4,1)(4,1) sűrűség, π(p)=4p3\pi(p)=4p^3. Írja fel a posterior Beta-paramétereit, várható értékét és móduszát. Mit tapasztal? Ismételje meg n=60,k=24n=60,\ k=24 mellett, és fogalmazza meg, hogyan függ a prior hatása a minta nagyságától.

19.1.6 Megoldások és indoklás

  1. A Beta(α,β)(\alpha,\beta) módusz, ha α,β>1\alpha,\beta>1: (α−1)/(α+β−2)(\alpha-1)/(\alpha+\beta-2). Itt α=7,β=10\alpha=7,\ \beta=10, tehát módusz 6/15=0.46/15 = 0.4. A likelihood kernel deriváltjának elsőrendű feltétele k/p−(n−k)/(1−p)=0k/p - (n-k)/(1-p)=0, ami szintén p=k/n=0.4p=k/n=0.4-et ad flat prior mellett. A várható érték α/(α+β)=7/17≈0.4118\alpha/(\alpha+\beta) = 7/17 \approx 0.4118; a sűrűség jobb széle hosszabb, ezért az átlag felfelé tolódik a móduszhoz képest. A módusz a legvalószínűbb paraméterpont, az átlag a posterior szerinti valószínűséggel súlyozott p-átlag.

  2. Lehetséges implementáció:

    def posterior_summary(prior, k, n):
        post = posterior_on_grid(prior, k, n)
        assert abs(trapezoid(post, grid) - 1.0) < 1e-8
        mean = posterior_mean(post)
        mode = grid[int(np.argmax(post))]
        lo, hi = equal_tail_interval(post)
        return post, mean, mode, lo, hi
    
    _, mean, mode, lo, hi = posterior_summary(flat_prior, 3, 10)
    print(mean, mode, lo, hi)

    A flat priorral a posterior Beta(1+3,1+10−3)=(1+3, 1+10-3)= Beta(4,8)(4,8): várható érték 4/12=1/3≈0.33334/12 = 1/3 \approx 0.3333, módusz 3/10=0.33/10 = 0.3. A numerikus mean-nek 10−310^{-3} nagyságrendű grid-hibán belül egyeznie kell; a mode az argmax miatt pontosan a legközelebbi rácspont, 0.3000.300 vagy 0.3010.301 körül.

  3. A mean_wrong az ∫p⋅unnorm(p)dp\int p \cdot \text{unnorm}(p)\,dp érték, nem oszt a ZZ-vel. A flat k=6,n=15k=6,\ n=15 esetben Zkernel≈∫01p6(1−p)9dp=B(7,10)≈1.249⋅10−5Z_{\text{kernel}} \approx \int_0^1 p^6(1-p)^9\,dp = B(7,10) \approx 1.249 \cdot 10^{-5}, és a helyes átlag:

    mean=∫punnorm(p)dpZkernel≈0.4118.\text{mean} = \frac{\int p\,\text{unnorm}(p)\,dp}{Z_{\text{kernel}}} \approx 0.4118.

    A mean_wrong nagyságrendje 10−510^{-5}, tehát nem értelmezhető prediktív valószínűségként. Az evidence_wrong nem teljes binomiális evidence, mert hiányzik a (nk)=5005\binom{n}{k}=5005 konstans. A helyes marginális likelihood flat priorral:

    P(k)=(156)∫01p6(1−p)9dp=1n+1=116=0.0625.P(k) = \binom{15}{6} \int_0^1 p^6(1-p)^9\,dp = \frac{1}{n+1} = \frac{1}{16} = 0.0625.

    A javítás tehát: Z = trapezoid(unnorm, grid); mean = trapezoid(grid*unnorm, grid) / Z; exact_evidence = comb(15, 6) * Z (rácsos hiba mellett).

  4. A Beta(4,1)(4,1) priorban α=4,β=1\alpha=4,\ \beta=1. A konjugált frissítés:

    α′=4+6=10,β′=1+(15−6)=10.\alpha' = 4 + 6 = 10,\qquad \beta' = 1 + (15 - 6) = 10.

    A posterior Beta(10,10)(10,10): várható érték 10/20=0.510/20 = 0.5, módusz (10−1)/(20−2)=0.5(10-1)/(20-2)=0.5. A prior erős, a minta nem elég a 0.40.4-es gyakoriság teljes átültetéséhez: a prior felfelé, a likelihood lefelé húz, az egyensúly éppen 0.50.5-re esik. n=60,k=24n=60,\ k=24 esetén α′=4+24=28\alpha'=4+24=28, β′=1+36=37\beta'=1+36=37; várható érték 28/65≈0.430828/65 \approx 0.4308, módusz 27/63≈0.428627/63 \approx 0.4286. A nagyobb minta már érezhetően a 0.40.4 felé húzza a posterior-t, tehát a priorhatás csökken.

19.1.7 Gyakori tévedés és önellenőrzés

A leggyakoribb hiba az implicit prior elhallgatása. Példa: n=5,k=0n=5,\ k=0 megfigyelés esetén a mintaarány 00, de a posterior erősen priortól függ. Flat priorral a posterior Beta(1,6)(1,6) várható értéke 1/7≈0.14291/7 \approx 0.1429. Szkeptikus Beta(1,4)(1,4) priorral a posterior Beta(1,9)(1,9) várható értéke 0.10.1. Optimista Beta(4,1)(4,1) priorral a posterior Beta(4,6)(4,6) várható értéke 0.40.4. Ugyanaz a nulla sikerű minta tehát 0.10.1 és 0.40.4 közötti prediktív valószínűséget is adhat. Aki „csak likelihoodot” mutat, de nem nevezi meg a priort, az valójában priorválasztást rejtett el; a prior elhallgatása nem teszi az elemzést feltételmentessé.

Önellenőrzés:

19.1.8 Rövid összefoglaló

A rácsos Bayesi frissítés a p∈[0,1]p\in[0,1] paramétert diszkrét pontokra bontja, minden pontban kiszámítja a prior és a Bernoulli-likelihood szorzatát, majd ZZ-vel normalizálja. A flat priorral a posterior Beta(7,10)(7,10), várható értéke 0.41180.4118; a szkeptikus Beta(1,4)(1,4) priorral Beta(7,13)(7,13), várható értéke 0.350.35. A prediktív valószínűség a posterior átlag, a normalizálás nélkül pedig sem prediktív, sem intervallum-állítás nem tehető. A prior explicit megadása kis minta esetén meghatározó, nagy minta esetén hatása csökken. Következő alkalmazásként a Credible interval és posterior predictive check alfejezetben a credible interval és posterior predictive check kerül elő, majd a teljes PyMC-modellezés.