Используя методы вероятностного моделирования сост...
Erstellt am: 22. April 2026
Beantwortet mit GPT-5.4 Thinking von Chat01
Erstellt am: 22. April 2026
Beantwortet mit GPT-5.4 Thinking von Chat01
Используя методы вероятностного моделирования составь байесовскую статистическую модель используя библиотеку PyMC.
Для переменных использовать нормальное распределение, для ошибки наблюдения - полунормальное (Half-normal-ditribution).
В прогнозировании результатов 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
Ниже — полный пример на PyMC для вашей задачи: построение байесовской линейной модели, получение апостериорных оценок двумя методами и апостериорный анализ.
Я принял такие допущения, потому что в условии есть небольшая неоднозначность:
Пусть
где
Априорные распределения:
pythonimport 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)
Это основной и наиболее надежный способ.
pythonwith 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 — критерий сходимости.Быстрее, но обычно менее точен, чем MCMC.
pythonwith 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))
pythonsummary_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)
Обычно:
pythonaz.plot_trace(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"]) plt.tight_layout() plt.show()
Что смотреть:
pythonaz.plot_posterior(trace_mcmc, var_names=["alpha", "beta1", "beta2", "sigma"], hdi_prob=0.95) plt.tight_layout() plt.show()
Это позволяет увидеть:
Проверим, насколько модель воспроизводит наблюдаемые данные.
pythonwith 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()
Если распределение предсказаний похоже на распределение наблюдений, модель описывает данные разумно.
pythonposterior_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)
pythonalpha_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()
Если модель корректна, остатки должны быть без выраженной структуры.
pythonimport 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. Построена байесовская линейная регрессионная модель для нормально распределенной зависимой переменной , где математическое ожидание представлено как линейная функция двух предикторов и .
Для параметров использованы нормальные априорные распределения, для стандартного отклонения ошибки — полунормальное распределение.
2. Апостериорные оценки получены двумя методами:
3. Проведен апостериорный анализ:
4. Результаты показывают, что модель способна восстановить истинные значения параметров , , , с разумной точностью при размере выборки 100.
Если хотите, я могу сразу оформить это в виде готового Jupyter Notebook или лабораторной работы с пояснениями и выводами.