2013-05-23 24 views
21

Nếu pymc thực hiện thuật toán Metropolis-Hastings để tìm ra các mẫu từ mật độ sau trên các tham số quan tâm, thì để quyết định có chuyển sang trạng thái tiếp theo trong chuỗi markov hay không. mật độ sau cho tất cả các giá trị tham số đã cho.Pymc đại diện cho chức năng phân phối và khả năng trước đây như thế nào?

Mật độ sau tương ứng với hàm khả năng dựa trên dữ liệu quan sát nhân với mật độ trước đó.

Mỗi loại được thể hiện trong pymc như thế nào? Làm thế nào để tính toán từng số lượng này từ đối tượng mô hình?

Tôi tự hỏi nếu có ai có thể cho tôi mô tả cấp cao về cách tiếp cận hoặc chỉ cho tôi nơi tôi có thể tìm thấy.

+0

Có tính đến việc không ai có thể trả lời bạn, tôi đề nghị hỏi tại đây: https://github.com/pymc-devs/pymc/issues – pablofiumara

+0

Điều này có vẻ giống như một công việc cho [nguồn] (https: //github.com/pymc-devs/pymc/blob/master/pymc/step_methods/metropolis.py#L47). Nó tương đối ngắn, và với sự hiểu biết rõ ràng của bạn về thuật toán, có lẽ một cái nhìn nhanh chóng sẽ được chiếu sáng hơn cho bạn hơn là cho tôi. –

Trả lời

3

Để đại diện cho trước, bạn cần một thể hiện của lớp Stochastic, trong đó có hai thuộc tính chính:

value : the variable's current value 
logp : the log probability of the variable's current value given the values of its parents 

Bạn có thể khởi tạo một trước với tên của phân phối mà bạn đang sử dụng.

Để thể hiện khả năng, bạn cần có cái gọi là Dữ liệu ngẫu nhiên. Đó là, một thể hiện của lớp Stochastic có cờ observed được đặt thành True. Giá trị của biến này không thể thay đổi và nó sẽ không được lấy mẫu. Một lần nữa, bạn có thể khởi tạo khả năng với tên của bản phân phối bạn đang sử dụng (nhưng đừng quên đặt cờ observed thành True).

Giả sử chúng ta có các thiết lập sau:

import pymc as pm 
import numpy as np 
import theano.tensor as t 

x = np.array([1,2,3,4,5,6]) 
y = np.array([0,1,0,1,1,1]) 

Chúng tôi có thể chạy một hồi quy logistic đơn giản như sau:

with pm.Model() as model: 
    #Priors 
    b0 = pm.Normal("b0", mu=0, tau=1e-6) 
    b1 = pm.Normal("b1", mu=0, tau=1e-6) 
    #Likelihood 
    z = b0 + b1 * x 
    yhat = pm.Bernoulli("yhat", 1/(1 + t.exp(-z)), observed=y) 
    # Sample from the posterior 
    trace = pm.sample(10000, pm.Metropolis()) 

Hầu hết những điều trên đến từ Chris Fonnesbeck của ipython máy tính xách tay here.

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. –

+0

Ben, bạn đang trộn pymc2 và ký hiệu pymc3. 'quan sát = true' là cho pymc2. Sau đó, người ta phải đưa ra giá trị trong 'giá trị'. pymc3 kết hợp hai từ khóa này và dữ liệu được đưa ra trực tiếp với 'quan sát = y', ngụ ý (quan sát = true). –

+0

nếu b0 là một vectơ và tất cả các phần tử của nó là độc lập. tức là trước đó có thể được viết là sản phẩm của mật độ? Làm thế nào để bạn viết điều này trong pymc? –