如何在pymc中实现自定义Gibbs抽样方案

时间:2015-01-05 16:25:19

标签: pymc

我有一个隐马尔可夫随机波动率模型(表示为线性状态空间模型)。我使用手写的Gibbs抽样方案来估计模型的参数。实际的采样器需要一些相当复杂的更新规则,我相信我需要手工编写。您可以看到这些更新规则here的Julia版本的示例。

我的问题如下:如何以自定义方式指定模型,然后交出运行采样器并将样本收集到pymc的工作?换句话说,我很乐意提供代码来完成所有繁重的工作(如何在每次扫描时更新每个参数块 - 利用每个块内的完整条件),但我想让pymc为我处理“会计” 。

我意识到我可能需要提供更多信息,以便其他人可以回答这个问题。问题是我不确定哪些信息会有用。所以,如果您觉得可以帮助我,但需要更多信息 - 请在评论中告诉我,我会更新问题。

1 个答案:

答案 0 :(得分: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

它与您的模型完全不同,但它应该展示所有部件。这会让你继续下去吗?