Olasılıksal Programlama Nedir?

Olasılıksal Programlama Nedir?

Bayes theorem
Bayes teoremi. Kaynak: https://swarm-help.zendesk.com/hc/en-us/articles/360003046932-Bayes-Theorem

Bayesci yöntemleri göz önüne aldığımızda, temelde iki farklı yaklaşım bulunmaktadır: istatistiksel modelleme ve olasılıksal programlama.

İstatistiksel modelleme, verinin az ve elde edilmesinin zor olduğu alanlarda önem kazanmaktadır. Sosyal Bilimler gibi büyük ölçekli kontrollü deneyleri uygulamanın zor olduğu alanlarda Bayesci modeller uzun yıllardır kullanılmaktadır. Ayrıca, az veri ile belirsizliğin (uncertainty) ifade edilmesinde Bayesci yöntemler daha başarılıdır.

Bayesci istatistiksel modelleme için, Andrew Gelman’ın da yazarı olduğu Data Analysis Using Regression and Multilevel/Hierarchical Models ve Bayesian Data Analysis kitaplarından faydalanılabilir.

Bayesci istatistiğe giriş için https://mrtkp9993.github.io/bayesciistatistik/ adresindeki yazılarıma bakabilirsiniz. Stan ile yazdığım örnek model kodlarına ise https://github.com/mrtkp9993/Statistical-Modeling-Examples adresinden ulaşabilirsiniz.

Olasılıksal programlama (Probabilistic programming) ise, aynı probleme üretici (generative) modeller ile yaklaşır. Olasılıksal programlama dilleri ise modellerin ifade edilmesini ve hesaplanmasını kolaylaştırmak için ortaya çıkmışlardır (WebPPL, Stan, Gen, Ventura, Edward, PyMC, Pyro vb.). Olasılıksal programlama ismi burada yanıltıcı olabilmektedir: Modeli ifade ettiğimiz değişkenler (model bileşenleri) olasılık dağılımları ile ifade edildiklerinden ve model bileşenleri dillerin temel yapısını oluşturduğundan, bu diller olasılıksal programlama dilleri olarak adlandırılır.

Örnek olarak https://peerj.com/articles/cs-55.pdf makalesinde yer alan doğrusal regresyon örneğini inceleyelim. (PyMC3 kütüphanesinin Tensorflow Probability üzerinde çalışan yeni versiyonu PyMC4 henüz Pre-release sürecindedir.)

Bayesci Doğrusal Regresyon

Bu bölümü daha iyi anlayabilmek için önce https://mrtkp9993.github.io/bayesciistatistik/ adresindeki Adım Adım Bayesci Çıkarım yazılarını okumanızı tavsiye ederim.

Bir tahmin edici değişkene sahip Bayesci doğrusal regresyon modeli aşağıdaki şekilde ifade edilebilir:

Bayes theorem
Bayes teoremi. Kaynak: https://swarm-help.zendesk.com/hc/en-us/articles/360003046932-Bayes-Theorem

Burada X tahmin edici; Y, μ ortalamaya sahip normal dağılan çıktı değişkeni; σ ise hata terimidir. Hesaplama için katsayı değişkenlerine (sabit terim ve eğim terimi) önsel dağılımlar belirlemeliyiz. Bayesci doğrusal regresyon modellerinde katsayıların önsel dağılımları sıklıkla normal dağılım seçilmektedir. Hata terimi için ise, varyans negatif olamayacağından, alttan sıfır ile sınırlı normal dağılım seçilebilir:

Bayes theorem
Bayes teoremi. Kaynak: https://swarm-help.zendesk.com/hc/en-us/articles/360003046932-Bayes-Theorem

Bu model PyMC3 ile aşağıdaki şekilde ifade edilebilir ve hesaplanabilir:

# Kaynak: https://docs.pymc.io/notebooks/GLM-linear.html

%matplotlib inline

from pymc3 import *

import numpy as np
import matplotlib.pyplot as plt

# Sahte regresyon verisinin üretilmesi
size = 200
true_intercept = 1
true_slope = 2

x = np.linspace(0, 1, size)
# y = a + b*x
true_regression_line = true_intercept + true_slope * x
# add noise
y = true_regression_line + np.random.normal(scale=.5, size=size)

data = dict(x=x, y=y)

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, xlabel='x', ylabel='y', title='Generated data and underlying model')
ax.plot(x, y, 'x', label='sampled data')
ax.plot(x, true_regression_line, label='true regression line', lw=2.)
plt.legend(loc=0);

# Modelin hesaplanması
with Model() as model: # model specifications in PyMC3 are wrapped in a with-statement
# Define priors
alpha = Normal('alpha', mu=0, sd=10)
beta = Normal('beta', mu=0, sd=10)
sigma = HalfNormal('sigma', sd=1)

# Define likelihood
likelihood = Normal('y', mu=alpha + beta * x,
sigma=sigma, observed=y)

# Inference!
trace = sample(3000, cores=2) # draw 3000 posterior samples using NUTS sampling


plt.figure(figsize=(7, 7))
traceplot(trace[100:])
plt.tight_layout();
plt.figure(figsize=(7, 7))
plt.plot(x, y, 'x', label='data')
plot_posterior_predictive_glm(trace, samples=100,
label='posterior predictive regression lines')
plt.plot(x, true_regression_line, label='true regression line', lw=3., c='y')
plt.title('Posterior predictive regression lines')
plt.legend(loc=0)
plt.xlabel('x')
plt.ylabel('y');

Kaynaklar

Genel içinde yayınlandı

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.