PyMC'de iki normal dağılım için montaj modeli


10

Daha fazla istatistik öğrenmeye çalışan bir yazılım mühendisi olduğum için, başlamadan önce beni affetmen gerekecek, bu ciddi yeni bölge ...

Ben öğrenme been PyMC ve bazı gerçekten (gerçekten) basit örnekleri çalışma. Çalışamadığım (ve ilgili örnekleri bulamadığım) bir problem, iki normal dağılımdan üretilen verilere bir model uydurmaktır.

Diyelim ki 1000 değerim var; 500'den bir Normal(mean=100, stddev=20)ve bir başka 500'den bir Normal(mean=200, stddev=20).

Onlara bir model sığdırmak istiyorsam, yani PyMC kullanarak iki ortalama ve tek standart sapmayı belirleyin. Biliyorum ki ...

mean1 = Uniform('mean1', lower=0.0, upper=200.0)
mean2 = Uniform('mean2', lower=0.0, upper=200.0)
precision = Gamma('precision', alpha=0.1, beta=0.1)

data = read_data_from_file_or_whatever()

@deterministic(plot=False)
def mean(m1=mean1, m2=mean2):
    # but what goes here?

process = Normal('process', mu=mean, tau=precision, value=data, observed=True)

yani, oluşturma işlemi Normal'dir, ancak mu iki değerden biridir. Sadece bir değer gelip gelmediğini arasında "karar" temsil etmek nasıl bilmiyorum m1ya m2.

Belki de bunu modellemek için tamamen yanlış bir yaklaşım benimsiyorum? Birisi bana bir örnek gösterebilir mi? HATA ve JAGS okuyabilirim, bu yüzden her şey yolunda.

Yanıtlar:


11

Yarısının bir dağıtımdan, diğer yarısının diğerinden geldiğinden kesinlikle emin misiniz? Değilse, oranı rastgele bir değişken olarak modelleyebiliriz (ki bu çok bayesci bir şeydir).

Yapacağım şey şu, bazı ipuçları gömülü.

from pymc import *

size = 10
p = Uniform( "p", 0 , 1) #this is the fraction that come from mean1 vs mean2

ber = Bernoulli( "ber", p = p, size = size) # produces 1 with proportion p.

precision = Gamma('precision', alpha=0.1, beta=0.1)

mean1 = Normal( "mean1", 0, 0.001 ) #better to use normals versus Uniforms (unless you are certain the value is  truncated at 0 and 200 
mean2 = Normal( "mean2", 0, 0.001 )

@deterministic
def mean( ber = ber, mean1 = mean1, mean2 = mean2):
    return ber*mean1 + (1-ber)*mean2


#generate some artificial data   
v = np.random.randint( 0, 2, size)
data = v*(10+ np.random.randn(size) ) + (1-v)*(-10 + np.random.randn(size ) )


obs = Normal( "obs", mean, precision, value = data, observed = True)

model = Model( {"p":p, "precision": precision, "mean1": mean1, "mean2":mean2, "obs":obs} )

2
Shameless tanıtım: Ben sadece Bayes ve pyMC ilgili bir blog makale yazdı anlamıyla ben bunu kontrol etmeye davet böylece, bu yayınlamadan önceki 1 dakika. Bayes'in Müthiş Gücü - Bölüm 1
Cam.Davidson.Pilon

müthiş! iki aracın karıştırılmasına yönelik bu yaklaşım tam olarak kafamı karıştırmaya çalıştığım şeydir.
mat kelcey

Ortalama1 ve ortalama2'nin Normal olarak Tekdüzen yerine dağıtıldığını söylemenin gerçek modelleme avantajını tam olarak anladığımdan emin değilim (Aynı doğruluk dürüst olmak için de geçerlidir, "Başka biri yaptıklarından beri Gamma kullanıyorum"). Öğrenecek çok şeyim var :)
mat kelcey

Tekdüzen kullanmak, orijinal örneğinizde olduğu gibi, ortalamanın bir değeri aşmadığını mutlak bir kesinlıkla bildiğinizi ima eder . Bu biraz patolojik. Tüm gerçek sayıların dikkate alınmasına izin verdiği için normal kullanmak daha iyidir.
Cam.Davidson.Pilon

1
Gama seçiminin matematiksel bir nedeni vardır. Gama, hassasiyetten önce eşleniktir , buradaki
Cam.Davidson.Pilon

6

Yukarıdaki tartışma ile ilgili birkaç nokta:

  1. Yaygın normal ve üniforma seçimi oldukça akademiktir (a) konjugasite konusunda endişe duymuyorsanız, bu durumda normal kullanacaksınız veya (b) gerçek değerin üniformanın uç noktalarının dışında olma olasılığı makul olabilir . PyMC ile, özellikle bir Gibbs örnekleyicisi kullanmak istemiyorsanız, konjugati hakkında endişelenmenize gerek yoktur.

  2. Bir gama aslında bir varyans / kesinlik parametresinden önce bilgi vermeyenler için mükemmel bir seçim değildir. Düşündüğünüzde daha bilgilendirici olabilir. Daha iyi bir seçim, standart sapmadan önce bir üniforma koymak, sonra ters bir kare ile dönüştürmektir. Ayrıntılar için Gelman 2006'ya bakınız.


1
ah fonnesbeck, pymc'nin temel geliştiricilerinden biridir! 2. noktaya kodlamanın nasıl bir örneğini gösterebilir misiniz?
Cam.Davidson.Pilon

teşekkürler fonnesbeck ve evet lütfen! hızlı bir şekilde örneğin 2 noktası :)
mat kelcey

1
aslında ... gist.github.com/4404631 hatları boyunca bir şey ifade ettiğini tahmin ediyorum ?
mat kelcey

Evet kesinlikle. Dönüşümü biraz daha kısaca yapabilirsiniz:tau = std_dev**-2
fonnesbeck

kesinlik ve std_dev arasındaki bu ilişkinin nereden geldiğini okumak için doğru yer neresi olurdu?
user979
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.