【问题标题】:Assembling univariate priors into a matrix for use in MvNormal将单变量先验组装成矩阵以用于 MvNormal
【发布时间】:2013-10-25 05:23:32
【问题描述】:

使用 pymc 3 时,是否可以将单变量随机变量组装成一个矩阵,然后将其用作多变量分布的先验?如果是这样,我怎样才能最好地做到这一点?

这是一个具体的例子。我想用三个 R.V. 和它们一起创建一个三角形矩阵 A:

a11_squared=Gamma(alpha=1, beta=2)
a22_squared=Gamma(alpha=1, beta=2)
a12=Normal(mu=0, tau=1)
a21=0

经过一些操作后,我会使用这个矩阵作为多元正态分布中精度参数的先验。

我认为这可能更多地与theano中张量变量的操作有关,所以我也会添加theano标签。

感谢您的宝贵时间!

编辑 1:这是我正在尝试做的一个最小示例:

from matplotlib.pylab import *
from pymc import *

cov=np.array([[2,1],[1,3]])
mean=([2,7])
tau=np.linalg.inv(cov)
N=1
z_data=np.ndarray.flatten(np.random.multivariate_normal(mean, cov, N))

def ex_tau(a11_squared, a22_squared, a12):
    ex_A=theano.tensor.stacklists([[theano.tensor.sqrt(a11_squared), a12], [theano.tensor.constant(0, dtype='float64'), theano.tensor.sqrt(a22_squared)]])
    ex_cov=ex_A.T.dot(ex_A)
    return theano.sandbox.linalg.ops.matrix_inverse(ex_cov)     

with Model() as model:    
    a11_squared=Gamma('a11_squared', alpha=1, beta=2)
    a22_squared=Gamma('a22_squared', alpha=1, beta=2)
    a12=Normal('a12', mu=0, tau=1)
    z=MvNormal('z', mu=mean, Tau=ex_tau(a11_squared, a22_squared, a12), shape=2, observed=z_data)

编辑 2:这是一个测试,表明 ex_tau 似乎在 pymc 之外完成了工作

from theano.tensor import stacklists, scalars, matrices, sqrt, constant, dot
from theano import function, printing
from theano.sandbox.linalg.ops import matrix_inverse

def ex_tau(a11_squared, a22_squared, a12):
    ex_A=stacklists([[sqrt(a11_squared), a12], [constant(0, dtype='float64'), sqrt(a22_squared)]])
    ex_cov=ex_A.T.dot(ex_A)
    return matrix_inverse(ex_cov)

printing.debugprint(ex_tau(2, 4, -3))

【问题讨论】:

    标签: theano pymc


    【解决方案1】:

    看起来stacklist 可能会做你想做的事。

    【讨论】:

    • 感谢您的回复。由于某种原因,这似乎对我不起作用。当我去取逆时,我得到了一个奇异矩阵错误,这不应该发生。我将在我的原始帖子中添加一些示例代码。
    • 谢谢,应该有帮助
    • pymc 中是否有某种测试值或缺少会导致此错误的测试值?我的示例函数 ex_tau 在其他情况下似乎也能正常工作...我将在我的原始帖子中添加一个简短的测试来说明这一点。
    • 我查看了 pymc 代码,发现均值、中位数和众数用于连续分布的测试值。按照我指定 Gamma 分布的方式,根据distributions/continuous.py,中位数等于零,这在现实中并不正确,但对于所使用的近似值来说是正确的。因此,似乎ex_tau 是在所有先验都为零的情况下进行测试的,从而导致了奇点问题。在 Gamma 先验中更改 alpha=2 似乎可以规避这个问题。当我实际去采样时,我遇到了更多问题,但这似乎是一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2021-11-19
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多