Olasılıksal Programlama Nedir?

Murat Koptur
3 min readDec 25, 2019

--

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:

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:

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');

--

--