2013-07-11 38 views
7

Đây có lẽ là một câu hỏi ngớ ngẩn.Xác định phân phối PyMC tùy chỉnh

Tôi đang cố gắng kết hợp dữ liệu với một tệp PDF rất lạ bằng cách sử dụng đánh giá MCMC trong PyMC. Đối với ví dụ này, tôi chỉ muốn tìm ra cách để phù hợp với phân phối bình thường mà tôi nhập thủ công tệp PDF thông thường. Mã của tôi là:

data = []; 
for count in range(1000): data.append(random.gauss(-200,15)); 

mean = mc.Uniform('mean', lower=min(data), upper=max(data)) 
std_dev = mc.Uniform('std_dev', lower=0, upper=50) 

# @mc.potential 
# def density(x = data, mu = mean, sigma = std_dev): 
# return (1./(sigma*np.sqrt(2*np.pi))*np.exp(-((x-mu)**2/(2*sigma**2)))) 

mc.Normal('process', mu=mean, tau=1./std_dev**2, value=data, observed=True) 

model = mc.MCMC([mean,std_dev]) 
model.sample(iter=5000) 

print "!" 
print(model.stats()['mean']['mean']) 
print(model.stats()['std_dev']['mean']) 

Ví dụ tôi đã tìm thấy tất cả sử dụng một cái gì đó như mc.Không bình thường hoặc mc.Phụ kiện hoặc không, nhưng tôi muốn phù hợp với chức năng mật độ đã nhận xét.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

9

Một cách dễ dàng là sử dụng trang trí ngẫu nhiên:

import pymc as mc 
import numpy as np 

data = np.random.normal(-200,15,size=1000) 

mean = mc.Uniform('mean', lower=min(data), upper=max(data)) 
std_dev = mc.Uniform('std_dev', lower=0, upper=50) 

@mc.stochastic(observed=True) 
def custom_stochastic(value=data, mean=mean, std_dev=std_dev): 
    return np.sum(-np.log(std_dev) - 0.5*np.log(2) - 
        0.5*np.log(np.pi) - 
        (value-mean)**2/(2*(std_dev**2))) 


model = mc.MCMC([mean,std_dev,custom_stochastic]) 
model.sample(iter=5000) 

print "!" 
print(model.stats()['mean']['mean']) 
print(model.stats()['std_dev']['mean']) 

Lưu ý rằng chức năng custom_stochastic tôi trả về khả năng đăng nhập, không phải là khả năng, và rằng đó là khả năng đăng nhập cho toàn bộ mẫu.

Có một vài cách khác để tạo nút ngẫu nhiên tùy chỉnh. Điều này doc cho biết thêm chi tiết, và điều này gist chứa một ví dụ bằng cách sử dụng pymc.Stochastic để tạo ra một nút với một ước tính mật độ hạt nhân.

+0

Tuyệt vời, điều đó rất hữu ích, cảm ơn rất nhiều. – stellographer

+0

@jcrudy. Tôi chạy vào câu trả lời của bạn khi cố gắng xác định đơn giản của riêng tôi trước. Để tránh gây ô nhiễm cho câu hỏi này, tôi bắt đầu của riêng tôi [ở đây] (http://stackoverflow.com/questions/23198247/custom-priors-in-pymc), và tôi đã tự hỏi nếu bạn có thể làm sáng tỏ nó. Cảm ơn. –

Các vấn đề liên quan