Используя методы вероятностного моделирования сост...

创建于:2026年4月22日

使用 GPT-5.4 Thinking 回答 Chat01

问题

Используя методы вероятностного моделирования составь байесовскую статистическую модель используя библиотеку PyMC.
Для переменных использовать нормальное распределение, для ошибки наблюдения - полунормальное (Half-normal-ditribution).

  1. построить модель
  2. получить астериорные оценки для неизвестных переменных в модели (2 метода)
  3. провести апостериорный анализ

В прогнозировании результатов Y как нормально распределенных наблюдений с ожидаемым значением u, которое является линейной функцией двух переменных предиктора.
Задача:
Альфа, омега= 1,1
Бета итая=[1, 2.5]
Size= 100
X1 = random(size)
X2 = random(size)*f
X3 = random(size)ff

Y=альфа+бета итая[i]*Xi+sigma
Где f = 0.3
Альфа = 1.09
Омега = 1
Бета итая = 1.34, 1.54

思考

Creating Bayesian model by PyMC in Russian

The user asked for a Bayesian statistical model using PyMC, possibly as a code artifact or notebook. I likely need to provide code and explanation, while resolving ambiguity around parameter duplication and mismatched expectations. I’ll focus on providing both MCMC and MAP methods for posterior analysis, using trace plots, HDI, and other diagnostics as needed.

Thought for 14s

回答

Ниже — полный пример на PyMC для вашей задачи: построение байесовской линейной модели, получение апостериорных оценок двумя методами и апостериорный анализ.

Я принял такие допущения, потому что в условии есть небольшая неоднозначность:

  • сказано, что YY зависит от двух предикторов, поэтому в модель включены X1X_1 и X2X_2;
  • X3X_3 в условии сгенерирован, но в формуле не используется, поэтому я его не включаю;
  • для неизвестных параметров α,β1,β2\alpha, \beta_1, \beta_2 использую Normal;
  • для ошибки наблюдения σ\sigma использую HalfNormal;
  • истинные значения для генерации данных беру из конца условия: α=1.09,σ=1,β1=1.34,β2=1.54\alpha = 1.09,\quad \sigma = 1,\quad \beta_1 = 1.34,\quad \beta_2 = 1.54

1) Построение модели

Математическая постановка

Пусть

YiN(μi,σ)Y_i \sim \mathcal{N}(\mu_i, \sigma)

где

μi=α+β1X1i+β2X2i\mu_i = \alpha + \beta_1 X_{1i} + \beta_2 X_{2i}

Априорные распределения:

αN(0,10)\alpha \sim \mathcal{N}(0, 10) β1N(0,10),β2N(0,10)\beta_1 \sim \mathcal{N}(0, 10), \quad \beta_2 \sim \mathcal{N}(0, 10) σHalfNormal(5)\sigma \sim \text{HalfNormal}(5)

Код: генерация данных и построение модели в PyMC

python
import numpy as np import pymc as pm import arviz as az import matplotlib.pyplot as plt # ----------------------------- # 1. Генерация синтетических данных # ----------------------------- np.random.seed(42) size = 100 f = 0.3 alpha_true = 1.09 sigma_true = 1.0 beta_true = np.array([1.34, 1.54]) X1 = np.random.random(size) X2 = np.random.random(size) * f X3 = np.random.random(size) * f * f # сгенерировано по условию, но не используется mu_true = alpha_true + beta_true[0] * X1 + beta_true[1] * X2 Y = np.random.normal(loc=mu_true, scale=sigma_true, size=size) # ----------------------------- # 2. Байесовская модель # ----------------------------- with pm.Model() as bayes_model: # Априоры alpha = pm.Normal("alpha", mu=0, sigma=10) beta1 = pm.Normal("beta1", mu=0, sigma=10) beta2 = pm.Normal("beta2", mu=0, sigma=10) sigma = pm.HalfNormal("sigma", sigma=5) # Линейный предиктор mu = alpha + beta1 * X1 + beta2 * X2 # Правдоподобие y_obs = pm.Normal("y_obs", mu=mu, sigma=sigma, observed=Y)

2) Получение апостериорных оценок для неизвестных переменных (2 метода)

Метод 1. MCMC-сэмплирование (NUTS)

Это основной и наиболее надежный способ.

python
with bayes_model: trace_mcmc = pm.sample( draws=2000, tune=1000, chains=4, target_accept=0.95, random_seed=42, return_inferencedata=True ) print(az.summary(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"], round_to=3))

Что вы получите

Таблица summary покажет:

  • mean — апостериорное среднее;
  • sd — стандартное отклонение;
  • hdi_3%, hdi_97% — доверительный интервал HDI;
  • ess_bulk, ess_tail — эффективный размер выборки;
  • r_hat — критерий сходимости.

Метод 2. Вариационный вывод (ADVI)

Быстрее, но обычно менее точен, чем MCMC.

python
with bayes_model: approx = pm.fit( n=30000, method="advi", random_seed=42 ) trace_vi = approx.sample(2000) print(az.summary(trace_vi, var_names=["alpha", "beta1", "beta2", "sigma"], round_to=3))

Сравнение двух методов

python
summary_mcmc = az.summary(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"], round_to=3) summary_vi = az.summary(trace_vi, var_names=["alpha", "beta1", "beta2", "sigma"], round_to=3) print("=== MCMC ===") print(summary_mcmc) print("\n=== VI (ADVI) ===") print(summary_vi)

Обычно:

  • MCMC дает более качественную апостериорную аппроксимацию;
  • ADVI работает быстрее и подходит для предварительной оценки.

3) Апостериорный анализ

3.1. Диагностика сходимости MCMC

python
az.plot_trace(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"]) plt.tight_layout() plt.show()

Что смотреть:

  • цепи должны хорошо перемешиваться;
  • не должно быть явных трендов;
  • распределения должны быть стабильны между цепями.

3.2. Апостериорные распределения параметров

python
az.plot_posterior(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"], hdi_prob=0.95) plt.tight_layout() plt.show()

Это позволяет увидеть:

  • центр распределения;
  • разброс неопределенности;
  • 95% HDI;
  • близость к истинным параметрам.

3.3. Posterior Predictive Check

Проверим, насколько модель воспроизводит наблюдаемые данные.

python
with bayes_model: ppc = pm.sample_posterior_predictive(trace_mcmc, random_seed=42) az.plot_ppc(az.from_pymc(posterior_predictive=ppc, model=bayes_model), figsize=(8, 4)) plt.show()

Если распределение предсказаний похоже на распределение наблюдений, модель описывает данные разумно.


3.4. Сравнение истинных и оцененных параметров

python
posterior_means = { "alpha": trace_mcmc.posterior["alpha"].mean().item(), "beta1": trace_mcmc.posterior["beta1"].mean().item(), "beta2": trace_mcmc.posterior["beta2"].mean().item(), "sigma": trace_mcmc.posterior["sigma"].mean().item(), } true_values = { "alpha": alpha_true, "beta1": beta_true[0], "beta2": beta_true[1], "sigma": sigma_true, } print("Истинные значения:") print(true_values) print("\nАпостериорные средние (MCMC):") print(posterior_means)

3.5. Проверка остатков

python
alpha_post = posterior_means["alpha"] beta1_post = posterior_means["beta1"] beta2_post = posterior_means["beta2"] mu_est = alpha_post + beta1_post * X1 + beta2_post * X2 residuals = Y - mu_est plt.figure(figsize=(8, 4)) plt.scatter(mu_est, residuals, alpha=0.7) plt.axhline(0, linestyle="--") plt.xlabel("Оцененное среднее mu") plt.ylabel("Остатки") plt.title("Анализ остатков") plt.show()

Если модель корректна, остатки должны быть без выраженной структуры.


Полный рабочий скрипт

python
import numpy as np import pymc as pm import arviz as az import matplotlib.pyplot as plt # ============================= # Генерация данных # ============================= np.random.seed(42) size = 100 f = 0.3 alpha_true = 1.09 sigma_true = 1.0 beta1_true = 1.34 beta2_true = 1.54 X1 = np.random.random(size) X2 = np.random.random(size) * f X3 = np.random.random(size) * f * f # не используется, так как модель с двумя предикторами mu_true = alpha_true + beta1_true * X1 + beta2_true * X2 Y = np.random.normal(mu_true, sigma_true, size=size) # ============================= # Построение модели # ============================= with pm.Model() as bayes_model: alpha = pm.Normal("alpha", mu=0, sigma=10) beta1 = pm.Normal("beta1", mu=0, sigma=10) beta2 = pm.Normal("beta2", mu=0, sigma=10) sigma = pm.HalfNormal("sigma", sigma=5) mu = alpha + beta1 * X1 + beta2 * X2 y_obs = pm.Normal("y_obs", mu=mu, sigma=sigma, observed=Y) # Метод 1: MCMC trace_mcmc = pm.sample( draws=2000, tune=1000, chains=4, target_accept=0.95, random_seed=42, return_inferencedata=True ) # Метод 2: ADVI approx = pm.fit(n=30000, method="advi", random_seed=42) trace_vi = approx.sample(2000) # Posterior predictive ppc = pm.sample_posterior_predictive(trace_mcmc, random_seed=42) # ============================= # Сводка результатов # ============================= print("=== Истинные параметры ===") print({ "alpha": alpha_true, "beta1": beta1_true, "beta2": beta2_true, "sigma": sigma_true }) print("\n=== Апостериорные оценки: MCMC ===") print(az.summary(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"], round_to=3)) print("\n=== Апостериорные оценки: ADVI ===") print(az.summary(trace_vi, var_names=["alpha", "beta1", "beta2", "sigma"], round_to=3)) # ============================= # Апостериорный анализ # ============================= az.plot_trace(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"]) plt.tight_layout() plt.show() az.plot_posterior(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"], hdi_prob=0.95) plt.tight_layout() plt.show() idata_ppc = az.from_pymc(posterior_predictive=ppc, model=bayes_model) az.plot_ppc(idata_ppc, figsize=(8, 4)) plt.show() # Остатки alpha_est = trace_mcmc.posterior["alpha"].mean().item() beta1_est = trace_mcmc.posterior["beta1"].mean().item() beta2_est = trace_mcmc.posterior["beta2"].mean().item() mu_est = alpha_est + beta1_est * X1 + beta2_est * X2 residuals = Y - mu_est plt.figure(figsize=(8, 4)) plt.scatter(mu_est, residuals, alpha=0.7) plt.axhline(0, linestyle="--") plt.xlabel("Оцененное mu") plt.ylabel("Остатки") plt.title("Анализ остатков") plt.show()

Краткий вывод для отчета

Можно оформить так:

1. Построена байесовская линейная регрессионная модель для нормально распределенной зависимой переменной YY, где математическое ожидание представлено как линейная функция двух предикторов X1X_1 и X2X_2.
Для параметров α,β1,β2\alpha, \beta_1, \beta_2 использованы нормальные априорные распределения, для стандартного отклонения ошибки σ\sigma — полунормальное распределение.

2. Апостериорные оценки получены двумя методами:

  • методом MCMC (алгоритм NUTS),
  • методом вариационного вывода ADVI.

3. Проведен апостериорный анализ:

  • исследованы апостериорные распределения параметров,
  • выполнена диагностика сходимости цепей,
  • построены posterior predictive checks,
  • проанализированы остатки модели.

4. Результаты показывают, что модель способна восстановить истинные значения параметров α=1.09\alpha = 1.09, β1=1.34\beta_1 = 1.34, β2=1.54\beta_2 = 1.54, σ=1\sigma = 1 с разумной точностью при размере выборки 100.

Если хотите, я могу сразу оформить это в виде готового Jupyter Notebook или лабораторной работы с пояснениями и выводами.

分享这个问答