مقدمه
تحلیل رگرسیون بیزی یکی از تکنیکهای قدرتمند در آمار و یادگیری ماشین است که میتواند به ما در درک الگوها و روابط در دادهها کمک کند. در این مقاله، ما به بررسی پیادهسازی عملی یک تحلیل رگرسیون بیزی سلسله مراتبی با استفاده از NumPyro خواهیم پرداخت. NumPyro یک کتابخانه مدرن برای استنباط بیزی در پایتون است که بر اساس JAX ساخته شده و به ما امکان میدهد تا با استفاده از سرعت و کارایی بالاتر، مدلهای پیچیدهای را توسعه دهیم.
تولید دادههای مصنوعی
قبل از آنکه به تحلیل رگرسیون بپردازیم، ابتدا لازم است که دادههای مصنوعی تولید کنیم. این دادهها به ما کمک میکنند تا بتوانیم مدل خود را آزمایش کرده و رفتارش را در شرایط مختلف بررسی کنیم. ما میتوانیم از تابع numpy.random.normal برای تولید دادههای تصادفی استفاده کنیم.
مثال کد تولید داده
import numpy as np
# تنظیم تصادفی بذر برای تولید داده
np.random.seed(42)
# تعداد مشاهدات
n = 100
# تولید دادهها
X = np.random.normal(size=n)
true_weights = 2.0
true_bias = 5.0
Y = true_weights * X + true_bias + np.random.normal(scale=1.0, size=n)
تعریف مدل احتمالی
حالا که دادههای خود را داریم، میتوانیم اقدام به تعریف مدل احتمالی برای رگرسیون بیزی کنیم. مدل ما به دنبال شناسایی وزنها و بایاس واقعی از دادهها است. در NumPyro، میتوانیم از ساختارهای numpyro.sample برای مشخص کردن توزیعهای پیشین استفاده کنیم.
مدل رگرسیون بیزی
import numpyro
from numpyro import distributions as dist
# تعریف مدل
def model(X, Y):
# توزیع پیشین برای وزن
weight = numpyro.sample('weight', dist.Normal(0, 1))
# توزیع پیشین برای بایاس
bias = numpyro.sample('bias', dist.Normal(0, 1))
# مدل احتمال برای دادهها
with numpyro.plate('data', X.shape[0]):
numpyro.sample('obs', dist.Normal(weight * X + bias, 1), obs=Y)
استنباط با NUTS
برای استنباط پارامترهای مدل، از الگوریتم NUTS (No-U-Turn Sampler) استفاده خواهیم کرد که یکی از بهترین روشها برای استنباط در مدلهای بیزی پیچیده است. ما میتوانیم از تابع numpyro.infer.NUTS برای پیادهسازی استنباط استفاده کنیم.
آغاز استنباط
from numpyro.infer import MCMC, NUTS
# تنظیماتی برای استنباط
nuts_kernel = NUTS(model)
# MCMC با 1000 گام نمونهگیری
mcmc = MCMC(nuts_kernel, num_warmup=500, num_samples=1000)
mcmc.run(X, Y)
تحلیل توزیعهای پسین
پس از استنباط، میتوانیم توزیعهای پسین وزن و بایاس را بررسی کنیم. برای تحلیل بیشتر، ما میتوانیم مقادیر میانگین، واریانس، و سایر مترادفهای آماری را استخراج کنیم.
تحلیل نتایج
samples = mcmc.get_samples()
print("Weight mean:", samples['weight'].mean())
print("Bias mean:", samples['bias'].mean())
پیشبینیهای پسین
با استفاده از توزیع پسین مدل، ما میتوانیم پیشبینیهای جدیدی انجام دهیم. این پیشبینیها به ما کمک میکنند تا درک بهتری از رفتار مدل در دادههای جدید داشته باشیم. پیشبینیهای جدید میتوانند با استفاده از توزیعهای یادشده انجام شوند.
پیشبینی
# پیشبینی با استفاده از توزیعهای پسین
predicted_y = samples['weight'].mean() * X_new + samples['bias'].mean()
جمعبندی و نتیجهگیری
در این مقاله، ما به طور جامع به پیادهسازی یک مدل رگرسیون بیزی سلسله مراتبی با استفاده از NumPyro پرداختیم. از تولید دادههای مصنوعی گرفته تا تعریف مدل، استنباط، تحلیل توزیعهای پسین و پیشبینیها، تمامی مراحل به تفصیل توضیح داده شدند. با گسترش تواناییهای هوش مصنوعی در تجزیه و تحلیل دادهها، استفاده از روشهای بایزی به یک ابزار ضروری برای تحلیلگران تبدیل شده است. این تکنیکها به ما اجازه میدهند تا با اطمینان بیشتری نسبت به نتایج بهدستآمده، تصمیمگیری کنیم.


