2026. június 29., hétfő

Mintavételezés python algoritmussal

Bayes-statisztika eloszlás (posterior)  Markov Chain Monte Carlo nem analytikus megoldás hanem mintavételezés Likelihood-alapú modellillesztés zajos adatok kezelése és konvergencia analízis burn-in fázis elfogadási aránnyal posterior eloszlás. A statisztikában és a statisztikus fizikában a Metropolis–Hastings algoritmus egy Markov-lánc Monte Carlo (MCMC) módszer véletlenszerű minták sorozatának kinyerésére olyan valószínűségi eloszlásokból , amelyekből a közvetlen mintavétel nehézkes. Az új mintákat két lépésben adják hozzá a sorozathoz: először egy új mintát javasolnak az előző minta alapján, majd a javasolt mintát vagy hozzáadják a sorozathoz, vagy elvetik a valószínűségi eloszlás adott pontbeli értékétől függően. A kapott sorozat felhasználható az eloszlás közelítésére (pl. hisztogram generálására ) vagy integrál kiszámítására (pl. várható érték ). A Metropolis–Hastings és más MCMC algoritmusokat általában többdimenziós eloszlásokból történő mintavételezésre használják, különösen akkor, ha a dimenziók száma magas. Egydimenziós eloszlások esetén általában vannak más módszerek (pl. adaptív elutasító mintavételezés ), amelyek közvetlenül független mintákat tudnak visszaadni az eloszlásból, és ezek mentesek az MCMC módszerekre jellemző autokorrelált minták problémájától .
--------------
import numpy as np
import matplotlib.pyplot as plt

print("=" * 75)
print("BAYES-INFERENCIA MCMC SEGÍTSÉGÉVEL")
print("Metropolis–Hastings paraméterbecslés")
print("=" * 75)

# -----------------------------
# SZINTETIKUS ADAT
# -----------------------------
np.random.seed(42)

true_a = 2.0
true_b = 1.5

x = np.linspace(0, 10, 100)
noise = np.random.normal(0, 0.5, size=len(x))

y = true_a * np.sin(true_b * x) + noise

print("Valódi paraméterek:")
print(f"a = {true_a}, b = {true_b}")

# -----------------------------
# LIKELIHOOD
# -----------------------------
def model(x, a, b):
    return a * np.sin(b * x)

def likelihood(a, b):
    y_pred = model(x, a, b)
    sigma = 0.5
    return np.exp(-np.sum((y - y_pred) ** 2) / (2 * sigma ** 2))

# -----------------------------
# PRIOR
# -----------------------------
def prior(a, b):
    if -5 < a < 5 and 0 < b < 5:
        return 1.0
    return 0.0

# -----------------------------
# MCMC (METROPOLIS–HASTINGS)
# -----------------------------
iterations = 20000

a_current = 1.0
b_current = 1.0

samples_a = []
samples_b = []

accept = 0

print("\nMCMC futtatása...")

for i in range(iterations):

    # javaslat
    a_proposal = np.random.normal(a_current, 0.2)
    b_proposal = np.random.normal(b_current, 0.2)

    # posterior
    current_posterior = likelihood(a_current, b_current) * prior(a_current, b_current)
    proposal_posterior = likelihood(a_proposal, b_proposal) * prior(a_proposal, b_proposal)

    # elfogadás
    if np.random.rand() < (proposal_posterior / (current_posterior + 1e-12)):

        a_current = a_proposal
        b_current = b_proposal
        accept += 1

    samples_a.append(a_current)
    samples_b.append(b_current)

    if i % 2000 == 0:
        print(f"Iteráció {i:5d} | a={a_current:.3f} | b={b_current:.3f}")

print("\nMCMC kész.")
print(f"Elfogadási arány: {accept / iterations:.3f}")

# -----------------------------
# EREDMÉNYEK
# -----------------------------
burn = 5000

a_est = np.mean(samples_a[burn:])
b_est = np.mean(samples_b[burn:])

print("\nBecslések:")
print(f"a ≈ {a_est:.3f}")
print(f"b ≈ {b_est:.3f}")

# -----------------------------
# VIZUALIZÁCIÓ
# -----------------------------
plt.figure(figsize=(12,5))

plt.subplot(1,2,1)
plt.plot(samples_a, alpha=0.5)
plt.axhline(true_a, color='red')
plt.title("a paraméter MCMC lánc")

plt.subplot(1,2,2)
plt.plot(samples_b, alpha=0.5)
plt.axhline(true_b, color='red')
plt.title("b paraméter MCMC lánc")

plt.tight_layout()
plt.show()

# -----------------------------
# POSTERIOR HISZT
# -----------------------------
plt.figure(figsize=(10,4))

plt.subplot(1,2,1)
plt.hist(samples_a[burn:], bins=50)
plt.axvline(true_a, color='red')
plt.title("Posterior: a")

plt.subplot(1,2,2)
plt.hist(samples_b[burn:], bins=50)
plt.axvline(true_b, color='red')
plt.title("Posterior: b")

plt.tight_layout()
plt.show()
--------------
===========================================================================
BAYES-INFERENCIA MCMC SEGÍTSÉGÉVEL
Metropolis–Hastings paraméterbecslés
===========================================================================
Valódi paraméterek:
a = 2.0, b = 1.5

MCMC futtatása...
Iteráció     0 | a=1.000 | b=1.000
Iteráció  2000 | a=1.000 | b=1.000
Iteráció  4000 | a=1.000 | b=1.000
Iteráció  6000 | a=1.000 | b=1.000
Iteráció  8000 | a=1.000 | b=1.000
Iteráció 10000 | a=1.000 | b=1.000
Iteráció 12000 | a=1.000 | b=1.000
Iteráció 14000 | a=1.000 | b=1.000
Iteráció 16000 | a=1.000 | b=1.000
Iteráció 18000 | a=1.000 | b=1.000

MCMC kész.
Elfogadási arány: 0.000

Becslések:
a ≈ 1.000
b ≈ 1.000
--------------


Nincsenek megjegyzések:

Megjegyzés küldése