15.1 Paraméter, becslő és likelihood

15.1.1 Cél és konkrét helyzet

A Northstar-kísérlet conversion_7d oszlopa egy ügyfélre 0 vagy 1 értékű kimenet. Ha egy jól körülhatárolt, homogén részpopulációt vizsgálunk, akkor az egyes ügyfelek kimeneteit ugyanazzal az ismeretlen pp valószínűséggel generált Bernoulli-megfigyelésként modellezhetjük. A teljes outcomes.csv-t nem szabad egyetlen pp-vel leírni, mert a kezdőlabor szerint a kezelés és a szegmens is módosítja a konverziós valószínűséget; ezt a feltételt a becslés előtt pontosan ki kell mondani.

Ebben az alfejezetben a bemenet egy rögzített, kézzel megadott 14 elemű minta:

x=(0,1,1,0,0,1,0,1,1,0,1,0,0,1).x = (0,1,1,0,0,1,0,1,1,0,1,0,0,1).

A megfigyelési egység egy randomizált ügyfél egyetlen bináris kimenete, azaz xi∈{0,1}x_i \in \{0,1\}. A keresett paraméter p=P(Xi=1)p = P(X_i = 1), amely ismeretlen, rögzített szám a [0,1][0,1] intervallumban. A cél: adjunk pontbecslést pp-re rácskereséssel, numerikus optimalizálással és zárt képlettel, majd ellenőrizzük, hogy a három eredmény egyezik. A mintában k=7k = 7 darab 1-es és n=14n = 14 megfigyelés van, ezért az előzetes, még nem indokolt becslésünk p̂=7/14=0,5\hat p = 7/14 = 0{,}5.

15.1.2 Paraméter, becslő és becslés

Egy statisztikai modellben a paraméter (parameter) a sokaság egy ismeretlen, rögzített jellemzője. Itt pp a konverziós valószínűség, értékkészlete [0,1][0,1], mértékegysége nincs, mert valószínűség. A minta megfigyelése előtt az adatot véletlen változók alkotják: X1,…,XnX_1, \dots, X_n független, azonos Bernoulli-eloszlású (iid) változók. A megfigyelés után viszont x1,…,xnx_1, \dots, x_n már rögzített számok; a likelihood-szemléletben mindig ez utóbbi a kiindulópont.

A becslő (estimator) olyan függvény, amely a mintából számít egy értéket a paraméterre. A legtermészetesebb becslő az átlag:

p̂=X‾=1n∑i=1nXi.\hat p = \bar X = \frac{1}{n}\sum_{i=1}^{n}X_i.

A becslő még véletlen változó, mert a nagybetűs XiX_i-k véletlenek. Amikor az aktuális mintát behelyettesítjük, a kapott számot becslésnek (estimate) nevezzük:

p̂obs=1n∑i=1nxi=kn,\hat p_{\text{obs}} = \frac{1}{n}\sum_{i=1}^{n}x_i = \frac{k}{n},

ahol k=∑ixik = \sum_i x_i a sikerek (1-esek) száma. Fontos megkülönböztetni a kettőt: a becslő mintavételi eloszlással és bizonytalansággal rendelkezik, a becslés egyetlen konkrét szám.

Egy gyors kézi kontroll: ha n=5n=5 és x=(1,0,0,1,1)x=(1,0,0,1,1), akkor k=3k=3 és p̂obs=3/5=0,6\hat p_{\text{obs}} = 3/5 = 0{,}6. Ez nem azt állítja, hogy pp pontosan 0,60{,}6, csak azt, hogy ezt a mintát a 0,60{,}6 paraméter magyarázza a legjobban az itt következő kritérium szerint.

15.1.3 Likelihood és log-likelihood

A likelihood-függvény (likelihood) azt méri, hogy egy adott pp paraméterérték mellett mennyire valószínű a ténylegesen megfigyelt minta. A valószínűségszámítási feltétel itt P(x∣p)P(x \mid p): az adat feltételes valószínűsége, ha pp az igazi paraméter. Iid Bernoulli-modellben:

L(p)=P(x1,…,xn∣p)=∏i=1npxi(1−p)1−xi=pk(1−p)n−k.L(p) = P(x_1, \dots, x_n \mid p) = \prod_{i=1}^{n} p^{x_i}(1-p)^{1-x_i} = p^k(1-p)^{n-k}.

A jelölések: pp a likelihood független változója, kk és nn pedig a rögzített mintából jövő konstansok. Az L(p)L(p) értéke egy nn hosszú, konkrét 0/1 sorozat előfordulási valószínűsége az adott pp mellett, tehát mértékegysége szintén nincs, értéke [0,1][0,1]-beli. A szokásos valószínűséggel ellentétben itt nem az adat a változó, hanem a paraméter; a likelihood tehát a paraméter függvénye.

A log-likelihood (log-likelihood) a likelihood természetes logaritmusa:

ℓ(p)=logL(p)=klogp+(n−k)log(1−p),\ell(p) = \log L(p) = k\log p + (n-k)\log(1-p),

értelmezési tartománya a nyílt (0,1)(0,1) intervallum; a széleken határértéket vizsgálunk. A logaritmus folytonos, szigorúan monoton növekvő függvény, ezért L(p)L(p) és ℓ(p)\ell(p) ugyanott veszi fel a maximumát. A logaritmussal a szorzatból összeg lesz, ami kézzel és számítógéppel is stabilabb, mert sok kis valószínűség helyett mérsékelt negatív számokat adunk össze.

Kézi kontroll a fenti n=5n=5, k=3k=3 példán: L(0,6)=0,63⋅0,42=0,03456L(0{,}6) = 0{,}6^3 \cdot 0{,}4^2 = 0{,}03456, míg L(0,5)=0,55=0,03125L(0{,}5) = 0{,}5^5 = 0{,}03125. A 0,60{,}6 nagyobb likelihoodot ad, mint a 0,50{,}5, ami egybevág a becsléssel. A log-likelihood értékek: ℓ(0,6)=3log0,6+2log0,4≈−3,365\ell(0{,}6) = 3\log 0{,}6 + 2\log 0{,}4 \approx -3{,}365, ℓ(0,5)=5log0,5≈−3,466\ell(0{,}5) = 5\log 0{,}5 \approx -3{,}466; a nagyobb (kevésbé negatív) ℓ\ell is ugyanarra a kedvezőbb pontra mutat.

15.1.4 Maximum likelihood becslés

A maximum likelihood becslés (maximum likelihood estimate, MLE) az a paraméterérték, amely maximalizálja a likelihood-függvényt:

p̂MLE=argmaxp∈[0,1]L(p)=argmaxp∈[0,1]ℓ(p).\hat p_{\text{MLE}} = \arg\max_{p \in [0,1]} L(p) = \arg\max_{p \in [0,1]} \ell(p).

Belső maximumot keresve deriváljuk a log-likelihood-ot a pp szerint. A Meredekség és numerikus derivált alfejezetben tanult egyváltozós deriválás szerint:

ℓ′(p)=kp−n−k1−p.\ell'(p) = \frac{k}{p} - \frac{n-k}{1-p}.

Ha 0<k<n0 < k < n, akkor a ℓ′(p)=0\ell'(p)=0 egyenlet megoldása:

kp=n−k1−p⇔k(1−p)=(n−k)p⇔p̂=kn.\frac{k}{p} = \frac{n-k}{1-p} \quad\Longleftrightarrow\quad k(1-p) = (n-k)p \quad\Longleftrightarrow\quad \hat p = \frac{k}{n}.

Mivel ℓ″(p)=−k/p2−(n−k)/(1−p)2<0\ell''(p) = -k/p^2 - (n-k)/(1-p)^2 < 0, ez valóban maximum. A szélső eseteket külön kell kezelni: ha k=0k=0, akkor L(p)=(1−p)nL(p)=(1-p)^n, amely szigorúan csökken a [0,1][0,1] intervallumon, így a maximum p=0p=0-nál van; ha k=nk=n, akkor L(p)=pnL(p)=p^n, és a maximum p=1p=1-nél van. Ilyenkor a deriválásos belső megoldás nem létezik, de a zárt alak k/nk/n akkor is jó, mert 0/n=00/n=0 és n/n=1n/n=1.

A likelihood-görbe alakját a hosszú minta n=14n=14, k=7k=7 esetén az alábbi, képletből számított pontok mutatják:

Bernoulli-likelihood, n=14, k=7 - Számított függvénypélda, nem mérés.

A görbe szimmetrikus a 0,50{,}5 körül, mert itt k=n−kk = n-k, és a maximum valóban p=0,5p=0{,}5-nél van.

15.1.5 Bias és variance

A becslőt véletlen változóként vizsgálva két kulcsjellemzője van. A torzítás (bias) az átlagos eltérés a valódi paramétertől:

Biasp(p̂)=𝔼p[p̂]−p.\operatorname{Bias}_p(\hat p) = \mathbb{E}_p[\hat p] - p.

Itt az index jelzi, hogy a várható értéket a pp paraméter feltétele mellett számoljuk. Mivel 𝔼p[p̂]=𝔼p[X1]=p\mathbb{E}_p[\hat p] = \mathbb{E}_p[X_1] = p, ezért a p̂\hat p becslő torzítatlan bármely pp esetén.

A variancia (variance) azt méri, mennyire szór a becslő ismételt mintavétel esetén:

Varp(p̂)=Varp(X1)n=p(1−p)n.\operatorname{Var}_p(\hat p) = \frac{\operatorname{Var}_p(X_1)}{n} = \frac{p(1-p)}{n}.

A standard hiba ennek gyöke, ahogy Nagy számok és centrális határeloszlás alfejezetben bevezettük: p(1−p)/n\sqrt{p(1-p)/n}. A mi n=14n=14 mintánknál p=0,5p=0{,}5 mellett az elméleti standard hiba 0,5⋅0,5/14≈0,134\sqrt{0{,}5 \cdot 0{,}5/14} \approx 0{,}134, azaz körülbelül 13 százalékpontos bizonytalanság – a minta kicsi, ezért az ML becslés sem “biztos”.

A torzítás és variancia nem mindig jár együtt javulva. Tekintsünk egy alternatív, zsugorított becslőt: p̃=(k+1)/(n+2)\tilde p = (k+1)/(n+2). Ez a becslő már torzított lesz általában, mert 𝔼p[p̃]=(np+1)/(n+2)\mathbb{E}_p[\tilde p] = (np+1)/(n+2), tehát Biasp(p̃)=(1−2p)/(n+2)\operatorname{Bias}_p(\tilde p) = (1-2p)/(n+2). A varianciája viszont kisebb: Varp(p̃)=np(1−p)/(n+2)2\operatorname{Var}_p(\tilde p) = np(1-p)/(n+2)^2. Például n=4n=4 és p=0,3p=0{,}3 mellett az MLE varianciája 0,21/4=0,05250{,}21/4 = 0{,}0525, míg a zsugorított becslőé 4⋅0,21/36=0,02334 \cdot 0{,}21/36 = 0{,}0233; cserébe torzítása 0,4/6≈0,0670{,}4/6 \approx 0{,}067. A becslőválasztás tehát tudatos kompromisszum lehet a torzítás és a variancia között, de az MLE torzítatlansága és egyszerű zárt alakja miatt jó kiindulópont.

15.1.6 Teljes minimális munkapélda

Az alábbi szkript egyetlen rögzített mintán rácskeresést, zárt alakot és scipy.optimize numerikus optimalizálást hasonlít össze. A lista formátumú input miatt nincs seed- vagy platformfüggő viselkedés.

# estimate_p.py
import numpy as np
from scipy.optimize import minimize_scalar
from scipy.stats import bernoulli
from scipy.special import beta as beta_function

x = np.array([0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1], dtype=np.int64)
n = x.shape[0]
k = int(x.sum())
assert x.ndim == 1 and n == 14
assert np.isin(x, [0, 1]).all()

def log_likelihood(p, k, n):
    p_arr = np.atleast_1d(np.asarray(p, dtype=float))
    out = np.full(p_arr.shape, -np.inf)
    valid = (p_arr > 0) & (p_arr < 1)
    out[valid] = k * np.log(p_arr[valid]) + (n - k) * np.log1p(-p_arr[valid])
    if np.ndim(p) == 0:
        return float(out[0])
    return out

# Rácskeresés: a nyílt (0, 1) intervallumot finom rácson járjuk be.
p_grid = np.linspace(1e-6, 1 - 1e-6, 40_001)
ll_grid = log_likelihood(p_grid, k, n)

# Független ellenőrzés a scipy Bernoulli-pontosságával.
ll_scipy = bernoulli.logpmf(x[:, None], p=p_grid).sum(axis=0)
np.testing.assert_allclose(ll_grid, ll_scipy, rtol=1e-12, atol=1e-12)

mle_grid = p_grid[int(np.argmax(ll_grid))]
mle_closed = k / n

# Numerikus optimalizálás: minimalizáljuk a negatív log-likelihood-ot.
res = minimize_scalar(
    lambda p: -log_likelihood(p, k, n),
    bounds=(1e-8, 1 - 1e-8),
    method="bounded",
)
mle_opt = res.x

print(f"x shape={x.shape}, dtype={x.dtype}")
print(f"n={n}, k={k}")
print(f"MLE grid        = {mle_grid:.5f}")
print(f"MLE closed form = {mle_closed:.5f}")
print(f"MLE optimizer   = {mle_opt:.5f}")
print(f"loglik at MLE   = {log_likelihood(mle_closed, k, n):.6f}")
print(f"grid step       = {p_grid[1] - p_grid[0]:.6f}")
print(f"normalizing check B(k+1,n-k+1) = {beta_function(k + 1, n - k + 1):.6e}")

Futtatás a lab/ munkakönyvtárból, az Interpreter és virtuális környezet alfejezetben beállított projektkörnyezettel:

uv run python estimate_p.py

A kimenet szemléltető, elméletileg várt értékekkel:

x shape=(14,), dtype=int64
n=14, k=7
MLE grid        = 0.50000
MLE closed form = 0.50000
MLE optimizer   = 0.50000
loglik at MLE   = -9.704061
grid step       = 0.000025
normalizing check B(k+1,n-k+1) = 1.943643e-05

15.1.7 Eredmény értelmezése és ellenőrzés

Kézzel is ellenőrizhető, hogy k=7k=7, n=14n=14 esetén ℓ(p)=7logp+7log(1−p)\ell(p) = 7\log p + 7\log(1-p). A derivált 7/p−7/(1−p)7/p - 7/(1-p), amely p=0,5p=0{,}5-nél nulla, tehát a maximum valóban 0,50{,}5. A likelihood-érték itt L(0,5)=0,514=1/16384≈6,10×10−5L(0{,}5) = 0{,}5^{14} = 1/16384 \approx 6{,}10 \times 10^{-5}, a log-likelihood pedig 14log0,5≈−9,70414 \log 0{,}5 \approx -9{,}704. A rácskeresés lépésköze Δp≈2,5×10−5\Delta p \approx 2{,}5\times 10^{-5}, tehát a rács eredményét ennyi toleranciával kell az elméleti értékhez viszonyítani. A zárt képlet és a numerikus optimalizáló ugyanarra a 0,50{,}5 értékre jutott, így a feladat ellenőrzési feltétele teljesül. A x tömb shape=(14,), dtype=int64, az input pedig csak 0 és 1 elemeket tartalmazhat. A normalizing check szám arra hívja fel a figyelmet, hogy L(p)L(p) integrálja nem 1; erre a gyakori tévedés részben visszatérünk.

A likelihood nem a paraméter feltételes valószínűsége: rögzített adat mellett a paraméter függvényeként vizsgáljuk. A maximum likelihood becslés tulajdonságai (pl. konzisztencia) rendszerint szabályossági és azonosíthatósági feltételektől függenek.

15.1.8 Feladatok

1. Feladat (értelmezés). Legyen a minta n=10n=10, x=(1,0,1,0,0,1,0,0,0,1)x=(1,0,1,0,0,1,0,0,0,1). Határozza meg kk-t, írja fel L(p)L(p) és ℓ(p)\ell(p) konkrét alakját, adja meg az MLE-t, és számítsa ki, hogy L(0,4)L(0{,}4) vagy L(0,5)L(0{,}5) nagyobb-e. Ellenőrizze a választ a log-likelihood értékekkel is.

2. Feladat (megvalósítás). Írjon mle_bernoulli(x, grid_size=20001) függvényt, amely 0/1 elemű, egydimenziós tömböt fogad, ellenőrzi az input ndim és dtype=bool|int feltételét, rácskereséssel megbecsüli pp-t, és visszaadja az (estimate, max_loglik) párt. Futtassa az x = np.array([1,0,1,1,0,0,0,1]) bemenetre, és indokolja a kapott becslést.

3. Feladat (hibakeresés). Az alábbi kód hibásan akar MLE-t számolni:

x = np.array([1, 0, 1, 1, 0, 1], dtype=int)
k = x.sum(); n = x.size

def loglik_bad(p, k, n):
    return k * np.log(p) - (n - k) * np.log(p)

grid = np.linspace(0.0, 1.0, 101)
vals = loglik_bad(grid, k, n)
print("MLE=", grid[np.argmax(vals)])

Nevezze meg a három hibát, számítsa ki a helyes becslést, és írjon egy javított, stabil rácskeresést.

4. Feladat (megváltozott feltétel). Tegyük fel, hogy a minta n=5n=5 megfigyelésből áll, és mindegyik 0: x=(0,0,0,0,0)x=(0,0,0,0,0). Mi lesz a likelihood-függvény és a maximum likelihood becslés? Miért nem ad belső megoldást a ℓ′(p)=0\ell'(p)=0 egyenlet? Hogyan kell ezért a numerikus optimalizálásnál a határt kezelni?

15.1.9 Megoldások és indoklás

Az 1. feladat megoldása. A mintában k=4k=4 darab 1-es van, tehát p̂=4/10=0,4\hat p = 4/10 = 0{,}4. A likelihood:

L(p)=p4(1−p)6,ℓ(p)=4logp+6log(1−p).L(p) = p^4(1-p)^6, \qquad \ell(p) = 4\log p + 6\log(1-p).

L(0,4)=0,44⋅0,66=0,0256⋅0,046656≈0,001194L(0{,}4) = 0{,}4^4 \cdot 0{,}6^6 = 0{,}0256 \cdot 0{,}046656 \approx 0{,}001194, míg L(0,5)=0,510≈0,000977L(0{,}5) = 0{,}5^{10} \approx 0{,}000977. Tehát L(0,4)>L(0,5)L(0{,}4) > L(0{,}5). Log-skálán: ℓ(0,4)≈−6,731\ell(0{,}4) \approx -6{,}731 és ℓ(0,5)≈−6,932\ell(0{,}5) \approx -6{,}932; a nagyobb ℓ\ell most is a 0,40{,}4-hez tartozik. Ez erősíti, hogy a megfigyelt 0,40{,}4 arány a maximális likelihoodú paraméterérték.

A 2. feladat megoldása. A mintában k=4k=4, n=8n=8, ezért a zárt alak p̂=0,5\hat p = 0{,}5. Egy lehetséges megvalósítás:

def mle_bernoulli(x, grid_size=20001):
    x = np.asarray(x)
    assert x.ndim == 1
    assert np.isin(x, [0, 1]).all()
    n = x.size
    k = int(x.sum())
    grid = np.linspace(1e-8, 1 - 1e-8, grid_size)
    ll = k * np.log(grid) + (n - k) * np.log1p(-grid)
    idx = int(np.argmax(ll))
    return float(grid[idx]), float(ll[idx])

x = np.array([1, 0, 1, 1, 0, 0, 0, 1])
estimate, max_ll = mle_bernoulli(x)
print(estimate, max_ll)  # szemléltető: 0.5 -12.476...

A rács felbontása 1/200001/20000 nagyságrendű, ezért a kimenetet célszerű legalább 10−410^{-4} tűréssel kezelni. A log-likelihood a maximumban 8log(0,5)≈−5,5458\log(0{,}5) \approx -5{,}545; a kód eltérő rácshatárok miatt kissé más, de ugyanabba a tűrésbe eső értéket adhat.

A 3. feladat megoldása. A három hiba:

  1. A formula rossz: (n−k)(n-k)-hoz is log(1−p)\log(1-p), nem −log(p)-\log(p) tartozik. A helyes alak klogp+(n−k)log(1−p)k\log p + (n-k)\log(1-p).
  2. A rács tartalmazza a 00 és 11 határokat; itt log0\log 0 nem értelmezhető, a helytelen eredményt vagy figyelmeztetést okoz.
  3. Az np.argmax a feltétel nélküli vektorban a legnagyobb érvényes elemet választja, de a hibás formula és a határpontok miatt ez a p=1p=1 lesz, mert ott a kifejezés 0, vagyis a legnagyobb a rossz tartományban.

A helyes számítás: k=4k=4, n=6n=6, tehát p̂=2/3≈0,667\hat p = 2/3 \approx 0{,}667. Javított rács:

grid = np.linspace(1e-8, 1 - 1e-8, 20_001)
ll = 4 * np.log(grid) + 2 * np.log1p(-grid)
print(grid[np.argmax(ll)])  # 0.6667 körüli érték

A 4. feladat megoldása. k=0k=0 esetén L(p)=(1−p)5L(p) = (1-p)^5, amely szigorúan fogy a [0,1][0,1] intervallumon, ezért a maximum p̂=0\hat p = 0. A log-likelihood ℓ(p)=5log(1−p)\ell(p) = 5\log(1-p), deriváltja ℓ′(p)=−5/(1−p)\ell'(p) = -5/(1-p), amely a nyílt (0,1)(0,1) intervallumon mindig negatív, tehát sosem nulla. A belső deriváltas megoldás ezért nem létezik. Numerikus minimalizáláskor az alsó határt ki kell zárni vagy limitként kezelni: a minimize_scalar például bounds=(1e-8, 1-1e-8) mellett az alsó határhoz közel ad eredményt, de a pontos MLE a 00 határérték. Éppen ezért a gyakorlatban a szélső esetekre a zárt k/nk/n képletet használjuk ellenőrzésként.

15.1.10 Gyakori tévedés ellenpéldával

A likelihood nem a paraméter normalizált valószínűségi eloszlása, ha nincs prior. A pp-re vonatkozó eloszlásként értelmezve azt várnánk, hogy a görbe alatti terület 1 legyen, de az ábrán látott L(p)L(p)-hez nincs ilyen normálás. A n=14n=14, k=7k=7 esetben

∫01p7(1−p)7dp=B(8,8)≈1,94×10−5,\int_0^1 p^7(1-p)^7\,dp = B(8,8) \approx 1{,}94 \times 10^{-5},

ahol BB a béta-függvény; ez nyilvánvalóan nem 1. A likelihood a megfigyelt adat együttes valószínűsége a paraméter függvényében, nem pedig a paraméter valószínűsége. Ha valaki L(0,5)≈6,10×10−5L(0{,}5) \approx 6{,}10\times 10^{-5} értékét annak valószínűségeként értelmezné, hogy p=0,5p=0{,}5, az hamis állítást tenne; a paraméter itt rögzített, ismeretlen szám, nem véletlen. Bayes-frissítéssel lehet a likelihoodból paraméter-eloszlást csinálni, de ahhoz explicit prior kell; ez a későbbi Bayesi frissítés rácson témája. Ez közvetlenül visszautal az Esemény, feltételes valószínűség és Bayes feltételes valószínűségre: L(p)=P(adat∣p)L(p) = P(\text{adat} \mid p), és ez általában nem azonos P(p∣adat)P(p \mid \text{adat}) értékkel.

15.1.11 Önellenőrzés

15.1.12 Rövid összefoglaló

A paraméter rögzített, ismeretlen sokasági mennyiség; a becslő véletlen mintából számoló függvény, a becslés pedig az aktuális mintán kapott konkrét szám. A likelihood-függvény az adat feltételes valószínűségét a paraméter függvényében mutatja, és a maximum likelihood becslés az ezt maximalizáló paraméterérték. Bernoulli-mintán az MLE a mintabeli sikerarány, k/nk/n; a log-likelihood a szorzatot stabil összeggé alakítja. A becslő torzítatlansága és varianciája mintavételi ismétlések alatt értelmezhető, és a kettő kompromisszuma becslőválasztási döntés. A rácskeresés, a zárt alak és a numerikus optimalizáló együttes ellenőrzése adja a következő lépés alapját, ahol a bizonytalanságot standard hibával és konfidenciaintervallummal számszerűsítjük Standard error és konfidenciaintervallum.