توزیع احتمال در احتمالات و آمار و در بسیاری از حوزههای دیگری که با پدیدههای تصادفی سر و کار دارند، مهم است. برای مثال، در مهندسی، توزیع احتمال میتواند برای توصیف و پیشبینی رفتار سیستمهای پیچیده مانند شبکههای برق، سیستمهای ترافیکی و غیره استفاده شود. در علوم زیستی، توزیع احتمال میتواند برای توصیف و پیشبینی رفتار سلولها، پاسخ سیستم ایمنی بدن به بیماریها و غیره استفاده شود. توزیعهای احتمال بسیاری وجود دارند، از جمله توزیع نرمال، توزیع دوجملهای، توزیع پواسون و غیره. هر کدام از این توزیعها مشخصات خاص خود را دارند که به طور خاص برای توصیف دادههای مختلف استفاده میشوند.
در پایتون، برای کار با توزیعهای احتمال، کتابخانههای مختلفی وجود دارند که برخی از آنها به شرح زیر هستند:
NumPy
این کتابخانه برای کار با آرایههای بزرگ و عملیات ریاضیاتی بر روی آنها بهینه شده است. NumPy شامل توابعی برای کار با توزیعهای احتمالی مانند توزیع نرمال، توزیع یکنواخت و توزیع بتا است. NumPy شامل توابعی برای کار با توزیعهای احتمالی است. برای استفاده از این توابع، ابتدا باید NumPy را به کد پایتون خود اضافه کنید. برای این کار، کد زیر را در ابتدای کد خود قرار دهید:
import numpy as np
حال میتوانید از توابع NumPy برای کار با توزیعهای احتمالی استفاده کنید. برای مثال، میتوانید از تابع `np.random.normal()` برای تولید نمونههای تصادفی از توزیع نرمال استفاده کنید. این تابع به شکل زیر عمل میکند:
np.random.normal(loc=0.0, scale=1.0, size=None)
در اینجا، `loc` میانگین توزیع نرمال، `scale` انحراف معیار توزیع نرمال و `size` تعداد نمونههای تصادفی هستند. برای مثال، میتوانید 1000 نمونه تصادفی از یک توزیع نرمال با میانگین 2 و انحراف معیار 3 تولید کنید:
samples = np.random.normal(loc=2.0, scale=3.0, size=1000)
همچنین، NumPy شامل توابعی برای کار با توزیعهای احتمالی مختلف دیگر نیز است. برای مثال، میتوانید از تابع `np.random.uniform()` برای تولید نمونههای تصادفی از توزیع یکنواخت استفاده کنید و از تابع `np.random.poisson()` برای تولید نمونههای تصادفی از توزیع پوآسون استفاده کنید.
SciPy
این کتابخانه، برای عملیات علمی و مهندسی بهینه شده است و شامل توابعی برای کار با توزیعهای احتمالی مانند توزیع نرمال، توزیع یکنواخت و توزیع بتا است. همچنین، SciPy شامل توابعی برای انجام تحلیل دادههای آماری مانند رگرسیون خطی و تحلیل عاملی است. SciPy یکی از پرکاربردترین کتابخانههای پایتون برای کار با توزیعهای احتمالی و آماری است. برای استفاده از این کتابخانه، ابتدا باید SciPy را به کد پایتون خود اضافه کنید. برای این کار، کد زیر را در ابتدای کد خود قرار دهید:
import scipy.stats as stats
حال میتوانید از توابع SciPy برای کار با توزیعهای احتمالی استفاده کنید. برای مثال، میتوانید از تابع `stats.norm()` برای ایجاد یک شیء توزیع نرمال استفاده کنید. این تابع به شکل زیر عمل میکند:
stats.norm(loc=0.0, scale=1.0)
در اینجا، `loc` میانگین توزیع نرمال و `scale` انحراف معیار توزیع نرمال هستند. برای مثال، میتوانید یک توزیع نرمال با میانگین 2 و انحراف معیار 3 ایجاد کنید:
normal_dist = stats.norm(loc=2.0, scale=3.0)
حال میتوانید از توابع این شیء برای محاسبه مقادیر مختلف مانند تابع چگالی احتمال، تابع توزیع تجمعی و مقادیر مختلف درصدی استفاده کنید. برای مثال، میتوانید تابع چگالی احتمال در نقطه 4 را محاسبه کنید:
pdf_value = normal_dist.pdf(4)
به طور مشابه، میتوانید تابع توزیع تجمعی در نقطه 3 را محاسبه کنید:
cdf_value = normal_dist.cdf(3)
همچنین، SciPy شامل توابعی برای کار با توزیعهای احتمالی مختلف دیگر نیز است. برای مثال، میتوانید از تابع `stats.uniform()` برای ایجاد یک شیء توزیع یکنواخت استفاده کنید و از تابع `stats.poisson()` برای ایجاد یک شیء توزیع پوآسون استفاده کنید.
Pandas
این کتابخانه برای کار با دادههای جدولی بهینه شده است و شامل توابعی برای کار با توزیعهای احتمالی مانند توزیع نرمال و توزیع بتا است. Pandas یکی از پرکاربردترین کتابخانههای پایتون برای کار با دادههای جدولی است. این کتابخانه شامل توابعی برای بارگیری دادهها، تبدیل دادهها، تحلیل دادهها و غیره است. برای استفاده از Pandas در کار با توزیعهای احتمالی، ابتدا باید Pandas را به کد پایتون خود اضافه کنید. برای این کار، کد زیر را در ابتدای کد خود قرار دهید:
import pandas as pd
حال میتوانید از Pandas برای بارگیری دادههای جدولی و تحلیل آنها استفاده کنید. برای مثال، میتوانید یک ستون از یک جدول داده را به عنوان یک توزیع احتمالی بخوانید. برای این کار، ابتدا جدول داده را بارگیری کنید و سپس ستون مورد نظر را به شکل یک آرایه NumPy تبدیل کنید. سپس، میتوانید از توابع NumPy و SciPy برای کار با توزیعهای احتمالی استفاده کنید.
برای مثال، فرض کنید که میخواهید ستون "age" از یک جدول داده را به عنوان یک توزیع نرمال بخوانید. ابتدا جدول داده را بارگیری کنید:
data = pd.read_csv('data.csv')
سپس، ستون "age" را به شکل یک آرایه NumPy تبدیل کنید:
age_array = data['age'].values
حال میتوانید از توابع NumPy و SciPy برای کار با توزیعهای احتمالی استفاده کنید. برای مثال، میتوانید یک شیء توزیع نرمال با استفاده از میانگین و انحراف معیار ستون "age" ایجاد کنید:
from scipy.stats import norm
age_mean = age_array.mean()
age_std = age_array.std()
age_dist = norm(loc=age_mean, scale=age_std)
حال میتوانید از توابع این شیء برای محاسبه مقادیر مختلف مانند تابع چگالی احتمال، تابع توزیع تجمعی و مقادیر مختلف درصدی استفاده کنید. برای مثال، میتوانید تابع چگالی احتمال در نقطه 40 را محاسبه کنید:
pdf_value = age_dist.pdf(40)
به طور مشابه، میتوانید تابع توزیع تجمعی در نقطه 30 را محاسبه کنید:
cdf_value = age_dist.cdf(30)
Scikit-learn
این کتابخانه برای یادگیری ماشین، شامل الگوریتمهای مختلفی برای کار با توزیعهای احتمالی مانند توزیع گاوسی، توزیع بتا و توزیع پوآسون است. Scikit-learn یکی از پرکاربردترین کتابخانههای پایتون برای یادگیری ماشین است. این کتابخانه شامل توابعی برای پیادهسازی الگوریتمهای یادگیری ماشین، پیشپردازش دادهها، ارزیابی مدلها و غیره است. برای استفاده از Scikit-learn در کار با توزیعهای احتمالی، میتوانید از توابعی همچون `KernelDensity` استفاده کنید. ابتدا، باید Scikit-learn را به کد پایتون خود اضافه کنید. برای این کار، کد زیر را در ابتدای کد خود قرار دهید:
from sklearn.neighbors import KernelDensity
حال میتوانید از `KernelDensity` برای تخمین توزیع احتمالی دادههای خود استفاده کنید. برای مثال، فرض کنید که میخواهید توزیع احتمالی دادههای ستون "age" از یک جدول داده را تخمین بزنید. ابتدا جدول داده را بارگیری کنید:
import pandas as pd
data = pd.read_csv('data.csv')
سپس، ستون "age" را به شکل یک آرایه NumPy تبدیل کنید:
age_array = data['age'].values.reshape(-1, 1)
در اینجا، از تابع `reshape` برای تغییر شکل آرایه به شکلی مناسب برای استفاده در `KernelDensity` استفاده شده است.
حال میتوانید یک شیء `KernelDensity` با استفاده از مدل هستهای گاوسی ایجاد کنید:
kde = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(age_array)
در اینجا، `kernel` نوع مدل هستهای و `bandwidth` پارامتر باندویت است.
حال میتوانید از تابع `score_samples` برای محاسبه مقدار لگاریتم توزیع احتمالی دادههای دلخواه استفاده کنید. برای مثال، میتوانید مقدار لگاریتم توزیع احتمالی در نقطه 40 را محاسبه کنید:
import numpy as np
log_pdf_value = kde.score_samples(np.array([[40]]))
pdf_value = np.exp(log_pdf_value)
به طور مشابه، میتوانید مقدار لگاریتم توزیع احتمالی در نقطه 30 را محاسبه کنید:
log_cdf_value = kde.score_samples(np.array([[30]]))
cdf_value = np.exp(log_cdf_value)
باید توجه داشت که توابع `score_samples` مقدار لگاریتم توزیع احتمالی را برمیگردانند، بنابراین برای محاسبه مقدار توزیع احتمالی باید از تابع `exp` استفاده کنید.
PyMC3
این کتابخانه برای مدلسازی بر پایه احتمالات بهینه شده است و شامل توابعی برای کار با توزیعهای احتمالی مانند توزیع نرمال، توزیع یکنواخت، توزیع بتا و توزیع پوآسون است. PyMC3 یک کتابخانه متن باز برای انجام برنامه نویسی احتمالاتی است، که مبتنی بر Python است. این کتابخانه امکاناتی برای تعریف و اجرای مدلهای احتمالاتی، انجام نمونهبرداری MCMC، ارزیابی مدلها و غیره را فراهم میکند. برای استفاده از PyMC3 در کار با توزیعهای احتمالی، میتوانید از توابعی همچون `Normal` و `Uniform` استفاده کنید. ابتدا، باید PyMC3 را به کد پایتون خود اضافه کنید. برای این کار، کد زیر را در ابتدای کد خود قرار دهید:
import pymc3 as pm
حال میتوانید از PyMC3 برای تعریف یک مدل احتمالاتی استفاده کنید. برای مثال، فرض کنید که میخواهید توزیع احتمالی دادههای ستون "age" از یک جدول داده را تخمین بزنید. ابتدا جدول داده را بارگیری کنید:
import pandas as pd
data = pd.read_csv('data.csv')
سپس، ستون "age" را به شکل یک متغیر تصادفی در PyMC3 تعریف کنید:
with pm.Model() as age_model:
age_mean = pm.Uniform('age_mean', lower=0, upper=100)
age_std = pm.Uniform('age_std', lower=0, upper=50)
age_dist = pm.Normal('age_dist', mu=age_mean, sd=age_std, observed=data['age'])
در اینجا، `Uniform` برای تعریف یک توزیع یکنوا استفاده شده است. همچنین، `Normal` برای تعریف یک توزیع نرمال با میانگین `age_mean` و انحراف معیار `age_std` استفاده شده است. `observed` به عنوان داده ورودی به مدل ارائه شده است.
حال میتوانید از تابع `sample` برای اجرای نمونهبرداری MCMC بر روی مدل استفاده کنید:
with age_model:
trace = pm.sample(1000, chains=1, tune=1000)
در اینجا، تعداد نمونههایی که باید از مدل نمونهبرداری شود به عنوان پارامتر اول به `sample` داده شده است. همچنین، با تعیین پارامتر `chains`، تعداد زنجیرههای MCMC تعیین شده است. پارامتر `tune` نیز تعداد نمونههایی است که باید برای تنظیم پارامترهای MCMC به صورت خودکار نمونهبرداری شود.
حال میتوانید از نمونههای به دست آمده برای محاسبه مقادیر مختلف مانند میانگین و انحراف معیار استفاده کنید:
age_mean_samples بعد از اجرای نمونهبرداری، میتوانید از خروجی به دست آمده در متغیر `trace` استفاده کنید. برای مثال، میانگین و انحراف معیار توزیع احتمالی دادههای ستون "age" را میتوانید با استفاده از نمونههای به دست آمده برای `age_mean` و `age_std` محاسبه کنید:
age_mean_samples = trace['age_mean']
age_std_samples = trace['age_std']
mean_estimate = age_mean_samples.mean()
std_estimate = age_std_samples.mean()
در اینجا، با دسترسی به نمونههای به دست آمده برای `age_mean` و `age_std`، میانگین و انحراف معیار توزیع احتمالی دادههای ستون "age" به ترتیب با `mean_estimate` و `std_estimate` محاسبه شدهاند.
همچنین، میتوانید توزیع احتمالی در نقاط دلخواه را با استفاده از تابع `pm.distributions.Normal.dist` محاسبه کنید. برای مثال، مقدار توزیع احتمالی در نقطه 40 را میتوانید با استفاده از مقادیر به دست آمده برای `age_mean` و `age_std` محاسبه کنید:
from scipy.stats import norm
pdf_value = norm(mean_estimate, std_estimate).pdf(40)
در اینجا، از تابع `pdf` برای محاسبه مقدار توزیع احتمالی در نقطه 40 استفاده شده است. به طور مشابه، میتوانید توزیع تجمعی احتمالی در نقطه 30 را با استفاده از تابع `cdf` محاسبه کنید:
cdf_value = norm(mean_estimate, std_estimate).cdf(30)
TensorFlow Probability
این کتابخانه برای مدلسازی بر پایه احتمالات بهینه شده است و شامل توابعی برای کار با توزیعهای احتمالی مانند توزیع نرمال، توزیع یکنواخت، توزیع بتا و توزیع پوآسون است. TensorFlow Probability یک کتابخانه متن باز برای انجام برنامهنویسی احتمالاتی است که بر پایه TensorFlow ساخته شده است. این کتابخانه ابزارهایی برای تعریف و اجرای مدلهای احتمالاتی، انجام نمونهبرداری MCMC، ارزیابی مدلها و غیره را فراهم میکند. برای استفاده از TensorFlow Probability در کار با توزیعهای احتمالی، میتوانید از کلاسهایی همچون `tfp.distributions.Normal` و `tfp.distributions.Uniform` استفاده کنید. ابتدا، باید TensorFlow Probability را به کد پایتون خود اضافه کنید. برای این کار، کد زیر را در ابتدای کد خود قرار دهید:
import tensorflow_probability as tfp
حال میتوانید از TensorFlow Probability برای تعریف یک مدل احتمالاتی استفاده کنید. برای مثال، فرض کنید که میخواهید توزیع احتمالی دادههای ستون "age" از یک جدول داده را تخمین بزنید. ابتدا جدول داده را بارگیری کنید:
import pandas as pd
data = pd.read_csv('data.csv')
سپس، ستون "age" را به شکل یک متغیر تصادفی در TensorFlow Probability تعریف کنید:
import tensorflow as tf
age_mean = tfp.util.TransformedVariable(
initial_value=50., bijector=tfp.bijectors.Softplus(), name='age_mean')
age_std = tfp.util.TransformedVariable(
initial_value=10., bijector=tfp.bijectors.Softplus(), name='age_std')
age_dist = tfp.distributions.Normal(loc=age_mean, scale=age_std)
در اینجا، `TransformedVariable` برای تعریف متغیرهای تصادفی با توابع نگاشت غیرخطی (برای مثال، تابع Softplus) استفاده شده است. همچنین، `Normal` برای تعریف یک توزیع نرمال با میانگین `age_mean` و انحراف معیار `age_std` استفاده شده است.
حال میتوانید از تابع `sample` برای اجرای نمونهبرداری MCMC بر روی مدل استفاده کنید:
num_samples = 1000
num_burnin_steps = 500
@tf.function
def run_chain():
samples = tfp.mcmc.sample_chain(
num_results=num_samples,
num_burnin_steps=num_burnin_steps,
current_state=[age_mean, age_std],
kernel=tfp.mcmc.HamiltonianMonteCarlo(
target_log_prob_fn=lambda age_mean, age_std: age_dist.log_prob(data['age']).sum(),
step_size=0.05,
num_leapfrog_steps=5),
trace_fn=lambda _, pkr: pkr.inner_results.is_accepted)
return samples
samples = run_chain()
age_mean_samples, age_std_samples = samples
در اینجا، تعداد نمونههایی که باید از مدل نمونهبرداری شود با `num_samples` تعیین شده است. همچنین، تعداد نمونههایی که باید برای تنظیم پارامترهای MCMCاستفاده شود با `num_burnin_steps` تعیین شده است. در اینجا، برای نمونهبرداری از الگوریتم Hamiltonian Monte Carlo استفاده شده است.
نمونههای بدست آمده از مدل، میانگین و انحراف معیار ستون "age" را به شکل زیر میتوانید دریافت کنید:
mean_age = tf.reduce_mean(age_mean_samples)
std_age = tf.reduce_mean(age_std_samples)
در نهایت، با توجه به نمونههای بدست آمده، میتوانید توزیع احتمالی ستون "age" را تخمین بزنید و برای مثال، مقدار P(age > 60) را محاسبه کنید:
age_dist = tfp.distributions.Normal(loc=mean_age, scale=std_age)
p_age_gt_60 = 1 - age_dist.cdf(60)
در اینجا، `cdf` برای محاسبه تابع توزیع احتمالی تجمعی استفاده شده است.
Pyro
این کتابخانه برای مدلسازی بر پایه احتمالات بهینه شده است و شامل توابعی برای کار با توزیعهای احتمالی مانند توزیع نرمال، توزیع یکنواخت، توزیع بتا و توزیع پوآسون است. Pyro یک کتابخانه احتمالاتی برای پایتون است که بر پایه PyTorch ساخته شده است. با استفاده از Pyro، میتوانید مدلهای احتمالاتی پیچیده را تعریف کنید و آنها را با استفاده از الگوریتمهای نمونهبرداری MCMC یا الگوریتمهای تخمین تغییرات گرادیانی (gradient-based optimization) بهینهسازی کنید.
برای استفاده از Pyro برای تعریف یک مدل احتمالاتی، ابتدا باید کتابخانه را نصب کنید. برای این کار، دستور زیر را در ترمینال وارد کنید:
pip install pyro-ppl
سپس، برای تعریف یک مدل احتمالاتی، میتوانید از دستورات زیر استفاده کنید:
import pyro
import pyro.distributions as dist
def model(data):
# تعریف پارامترهای مدل
mu = pyro.param('mu', torch.tensor(0.))
sigma = pyro.param('sigma', torch.tensor(1.), constraint=dist.constraints.positive)
# تعریف متغیر تصادفی برای دادهها
with pyro.plate('data', len(data)):
x = pyro.sample('x', dist.Normal(mu, sigma), obs=data)
return x
در این کد، تابع `model` یک تابع شبکه عصبی PyTorch است که یک توزیع احتمالی بر روی دادههای ورودی (در اینجا، دادهها را با نام `data` مشخص کردهایم) تعریف میکند. این مدل دو پارامتر دارد: `mu` و `sigma` که با استفاده از تابع `pyro.param` تعریف شدهاند. همچنین، با استفاده از `pyro.sample`، یک متغیر تصادفی با توزیع نرمال با میانگین `mu` و انحراف معیار `sigma` تعریف شده است.
برای استفاده از این مدل برای یادگیری، میتوانید از الگوریتم Variational Inference استفاده کنید. برای این کار، دستورات زیر را اجرا کنید:
from pyro.infer import SVI, Trace_ELBO
from pyro.optim import Adam
# تعریف تابع تخمین توزیع پسین
def guide(data):
# تعریف پارامترهای توزیع پسین
mu_q = pyro.param('mu_q', torch.tensor(0.))
sigma_q = pyro.param('sigma_q', torch.tensor(1.), constraint=dist.constraints.positive)
# تعریف متغیر تصادفی برای دادهها
with pyro.plate('data', len(data)):
pyro.sample('x', dist.Normal(mu_q, sigma_q))
# تعریف دادهها
data = torch.randn(100)
# تعریف تابع هزینه
svi = SVI(model, guide, Adam({'lr': 0.01}), loss=Trace_ELBO())
# آموزش مدل
for i in range(1000):
loss = svi.step(data)
if i % 100 == 0:
در این کد، تابع `guide` یک تابع شبکه عصبی PyTorch است که یک توزیع احتمالی برای پارامترهای `mu` و `sigma` تعریف میکند. این توزیع پسین با استفاده از تابع `pyro.param` تعریف شده است.
در ادامه، دادههای مورد استفاده برای آموزش مدل را با استفاده از `torch.randn` تعریف کردهایم. سپس، با استفاده از تابع `SVI`، تابع هزینه Trace ELBO و الگوریتم بهینهساز Adam، یک شیء SVI تعریف میکنیم. سپس، با استفاده از تابع `step`، مدل را بر اساس دادههای ورودی آموزش میدهیم.
با پایان آموزش، میتوانید مقادیر پارامترهای پسین را دریافت کنید:
mu_q = pyro.param('mu_q')
sigma_q = pyro.param('sigma_q')
همچنین، میتوانید توزیع احتمالی پارامترهای پسین را با استفاده از دستورات زیر تخمین بزنید:
from pyro.infer import Predictive
predictive = Predictive(model=model, guide=guide, num_samples=1000)
samples = predictive(data)
mu_samples = samples['mu'].detach().numpy()
sigma_samples = samples['sigma'].detach().numpy()
mu_mean = mu_samples.mean()
sigma_mean = sigma_samples.mean()
در اینجا، با استفاده از تابع `Predictive`، میتوانید توزیع احتمالی پارامترهای پسین را تخمین بزنید. با استفاده از `num_samples`، تعداد نمونههایی که باید برای تخمین توزیع احتمالی استفاده شوند، تعیین میشود. سپس، با استفاده از `samples`، میتوانید نمونههای بدست آمده از توزیع احتمالی پارامترهای پسین را دریافت کنید. در نهایت، با استفاده از `mean`، میانگین توزیع احتمالی پارامترهای پسین را محاسبه میکنیم.
کلام آخر
این کتابخانهها فقط بخشی از کتابخانههای موجود برای کار با توزیعهای احتمال در پایتون هستند. به دلیل وجود بسیاری از کتابخانهها، بسته به نیاز شما ممکن است که از یکی یا چندین کتابخانه استفاده کنید. به عنوان مثال، اگر شما به دنبال یک کتابخانه برای مدلسازی بر پایه احتمالات هستید، PyMC3، TensorFlow Probability و Pyro هر سه گزینههای خوبی هستند. با این حال، اگر به دنبال یک کتابخانه برای کار با دادههای جدولی هستید، Pandas گزینهی مناسبی است. همچنین، برای کار با توزیعهای احتمالی، کتابخانه NumPy بسیار پرکاربرد است و اکثر کتابخانههای دیگر نیز برای برخی از عملیات خود از NumPy استفاده میکنند. بنابراین، اگر با NumPy آشنایی دارید، شاید بهتر باشد از آن برای کار با توزیعهای احتمالی استفاده کنید.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟