我有一个隐马尔可夫随机波动率模型(表示为线性状态空间模型)。我使用手写的Gibbs抽样方案来估计模型的参数。实际的采样器需要一些相当复杂的更新规则,我相信我需要手工编写。您可以看到这些更新规则here的Julia版本的示例。
我的问题如下:如何以自定义方式指定模型,然后交出运行采样器并将样本收集到pymc的工作?换句话说,我很乐意提供代码来完成所有繁重的工作(如何在每次扫描时更新每个参数块 - 利用每个块内的完整条件),但我想让pymc为我处理“会计” 。
我意识到我可能需要提供更多信息,以便其他人可以回答这个问题。问题是我不确定哪些信息会有用。所以,如果您觉得可以帮助我,但需要更多信息 - 请在评论中告诉我,我会更新问题。
答案 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
它与您的模型完全不同,但它应该展示所有部件。这会让你继续下去吗?