【问题标题】:pymc3 Conditional deterministic likelihood functionpymc3 条件确定似然函数
【发布时间】:2017-11-04 18:31:32
【问题描述】:

我是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 模型的示例。

我没有说明可能性,因为它很长。

【问题讨论】:

    标签: python pymc data-fitting pymc3 model-fitting


    【解决方案1】:

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

    在此处发布有关模型的可能性代码或一些文档会很有帮助,以便我们了解如何实现它 - 在我可以查看之前,这将是一个有点模糊的答案可能性。

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 2015-04-11
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多