pymc3 条件确定性似然函数

pymc3 Conditional deterministic likelihood function

我是 PyMC3 的新手,正在尝试找到一组适合实验数据的参数。我的问题是我的似然函数取决于参与者之前的反应。

数据具有以下矩阵形式:

participant | trial0 | trial1 | ... | trialn
p0 | x | x | ... | x
....
p1 | x | x | ... | x

其中 x 编纂了参与者在该试验中的反应,值为 0, 1, or 2。现在,我有兴趣为每个参与者推断可能的参数 p。为简单起见,假设参与者可能属于以下三种类型之一:t1t2t3 和第三个参数 l 在这些类型中保持不变。我想根据每个参与者在整个实验中的行为、类型在参与者中的一般分布以及最适合 l.

推断出每个参与者的可能类型

问题:我的似然函数,称之为 lhs,是确定性的;插入参与者类型 (t={1,2,3}),l 的值,以及参与者过去的反应和它将为您提供当前试验中观察到的数据 x={0,1,2} 的概率。我的问题是我不知道如何告诉 PyMC3 模型对于试验 n 中的每个响应(0,1 或 2),似然函数取决于响应的顺序在最多 n 次试验中。我需要这个,因为在每次试验后,lhs 都会根据试验值进行更新(参与者在实验中学习,因此他们表现出特定反应的可能性也会发生变化。

我假设有一种聪明的方法可以将每次试验的响应编码成这样,即模型递归地计算试验中每个响应的似然函数 n > 0,或者有一个功能告诉它数据取决于以前的数据。唉,我还没有找到任何一个例子来说明这两个想法是如何工作的。

这是我拥有的:

import numpy as np
import pymc3 as pm

#data is a pandas dataframe where each row
#is a participant, each column a trial, and 
#each cell has value 0,1, or 2.


with pm.Model() as model:
    #Priors
    l = pm.Gamma('lam',10,1.0/0.5) #my prior for the value of l
    p_tau = pm.Dirichlet('p_tau',np.ones(3)) #unbiased prior over types
    tau = pm.Categorical('tau', p=p_tau, shape=3) #distr. over types I want to infer

    #data likelihood function
    lhs = ... #likelihood function; takes l, tau, 
              #and sequentially observed data up to trial n-1 
              #to compute the likelihood of the response of trial n

    #Here's the issue. data would be 0,1,2
    #But lhs should depend on previous trials
    pm.Categorical('obs', p=lhs, observed=data) 

关于模型的建议、数据编码或实施的具有相似特征的 PyMC3 模型的示例将不胜感激。

我没有指定可能性,因为它很长。

看来您要做的是在给定一系列响应的情况下为每个人推断类型 t1、t2 或 t3 的概率(我觉得这个模型可能有点像马尔可夫链)。

post 似然代码或此处有关模型的一些文档将对我们有所帮助,以便我们了解它是如何实现的——这将是一个有点模糊的答案,直到我可以看看可能性。

在 pymc3 中执行条件的最简单方法是使用 Theano 的 switch op,记录在此处:http://deeplearning.net/software/theano/tutorial/conditions.html

基本上switch可以这样使用:theano.switch(condition, expression_if_true, expression_if_false)。您想在 pymc3 可能性中使用它而不是 ifelse,因为 switch 可以按元素使用,但 ifelse 不能。