2015-01-05 17 views
2

我有一個隱馬爾可夫隨機波動率模型(表示爲線性狀態空間模型)。我正在使用手寫的吉布斯採樣方案來估計模型的參數。實際的採樣器需要一些相當複雜的更新規則,我相信我需要手動編寫。您可以看到這些更新規則here的Julia版本的示例。如何在pymc中實現自定義吉布斯採樣方案

我的問題如下:我怎樣才能以自定義的方式指定模型,然後交付運行採樣器和收集樣品到pymc的工作?換句話說,我很樂意提供代碼來完成所有繁重的工作(如何在每次掃描時更新每個參數塊 - 利用每個塊中的全部條件),但是我想讓pymc爲我處理「會計」 。

我意識到我可能需要提供更多的信息,以便其他人可以回答這個問題。問題是我不確定什麼信息將是有用的。所以,如果你覺得你可以幫我解決這個問題,但需要更多的信息 - 請在評論中告訴我,我會更新這個問題。

回答

1

這裏是a custom sampler in PyMC2一個例子:

class BDSTMetropolis(mc.Metropolis): 
    def __init__(self, stochastic): 
     mc.Metropolis.__init__(self, stochastic, scale=1., proposal_sd='custom', 
      proposal_distribution='custom', verbose=None, tally=False) 

    def propose(self): 
     T = self.stochastic.value 

     T.u_new, T.v_new = T.edges()[0] 
     while T.has_edge(T.u_new, T.v_new): 
      T.u_new, T.v_new = random.choice(T.base_graph.edges()) 

     T.path = nx.shortest_path(T, T.u_new, T.v_new) 
     i = random.randrange(len(T.path)-1) 
     T.u_old, T.v_old = T.path[i], T.path[i+1] 

     T.remove_edge(T.u_old, T.v_old) 
     T.add_edge(T.u_new, T.v_new) 
     self.stochastic.value = T 

    def reject(self): 
     T = self.stochastic.value 
     T.add_edge(T.u_old, T.v_old) 
     T.remove_edge(T.u_new, T.v_new) 
     self.stochastic.value = T 

它非常不同於你的模型,但它應該表現出所有的部件。這足以讓你繼續下去嗎?