Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pymc3:如何定义参数的有序向量_Python_Pymc3 - Fatal编程技术网

Python Pymc3:如何定义参数的有序向量

Python Pymc3:如何定义参数的有序向量,python,pymc3,Python,Pymc3,我试着做一个有序的逻辑回归,其中一个参数是割点的有序向量。我不知道如何定义它们 我想出的一个非常愚蠢的方法是手动定义向量的每个分量,使用一个作为另一个的边界: with pm.Model() as bound_model: a = pm.Normal('a', mu=0, sd=10) BoundedB = pm.Bound(pm.Normal, upper=a) b = BoundedB('b', mu=0, sd=10) BoundedC = pm.Bound

我试着做一个有序的逻辑回归,其中一个参数是割点的有序向量。我不知道如何定义它们

我想出的一个非常愚蠢的方法是手动定义向量的每个分量,使用一个作为另一个的边界:

with pm.Model() as bound_model:
    a = pm.Normal('a', mu=0, sd=10)
    BoundedB = pm.Bound(pm.Normal, upper=a)
    b = BoundedB('b', mu=0, sd=10)
    BoundedC = pm.Bound(pm.Normal, upper=b)
    c = BoundedC('c', mu=0, sd=10)

    bound_trace = pm.sample(1000)

这几乎没有效率,我不确定它们是否会像预期的那样工作。有更好的方法吗?

我想这是pymc3中缺少的功能。我可能会写一个pull请求,但在此期间,您可以使用如下内容:

class Ordered(pymc3.distributions.transforms.ElemwiseTransform):
    name = "ordered"

    def forward(self, x):
        out = tt.zeros(x.shape)
        out = tt.inc_subtensor(out[0], x[0])
        out = tt.inc_subtensor(out[1:], tt.log(x[1:] - x[:-1]))
        return out

    def backward(self, y):
        out = tt.zeros(y.shape)
        out = tt.inc_subtensor(out[0], y[0])
        out = tt.inc_subtensor(out[1:], tt.exp(y[1:]))
        return tt.cumsum(out)

    def jacobian_det(self, y):
        return tt.sum(y[1:])
N = 10
with pm.Model() as model:
    pm.Normal('y', mu=np.zeros(N), sd=1, shape=N, 
              transform=Ordered(), testval=np.arange(N))
然后像这样使用它:

class Ordered(pymc3.distributions.transforms.ElemwiseTransform):
    name = "ordered"

    def forward(self, x):
        out = tt.zeros(x.shape)
        out = tt.inc_subtensor(out[0], x[0])
        out = tt.inc_subtensor(out[1:], tt.log(x[1:] - x[:-1]))
        return out

    def backward(self, y):
        out = tt.zeros(y.shape)
        out = tt.inc_subtensor(out[0], y[0])
        out = tt.inc_subtensor(out[1:], tt.exp(y[1:]))
        return tt.cumsum(out)

    def jacobian_det(self, y):
        return tt.sum(y[1:])
N = 10
with pm.Model() as model:
    pm.Normal('y', mu=np.zeros(N), sd=1, shape=N, 
              transform=Ordered(), testval=np.arange(N))
编辑:关于此处发生的情况的简短说明:

我们定义了一个从$R^n$到有序序列集的映射

f(x_1) = x_1,\quad f(x_i) = f(x_{i - 1}) + exp(x_i)
因为这是一个很好的双射函数,我们可以通过

P_{R^n}(x) = P_{ordered}(f(x)) \cdot |J_{f(x)}|
其中J是变换的雅可比矩阵

采样器将只看到未受约束的值。这就是
Bound
最初的实现方式


如果你想要更多的细节,你可以看一下。它包含了这些转换的一个很好的描述,pymc3和stan的数学原理是一样的。

我想这是pymc3中缺少的一个功能。我可能会写一个pull请求,但在此期间,您可以使用如下内容:

class Ordered(pymc3.distributions.transforms.ElemwiseTransform):
    name = "ordered"

    def forward(self, x):
        out = tt.zeros(x.shape)
        out = tt.inc_subtensor(out[0], x[0])
        out = tt.inc_subtensor(out[1:], tt.log(x[1:] - x[:-1]))
        return out

    def backward(self, y):
        out = tt.zeros(y.shape)
        out = tt.inc_subtensor(out[0], y[0])
        out = tt.inc_subtensor(out[1:], tt.exp(y[1:]))
        return tt.cumsum(out)

    def jacobian_det(self, y):
        return tt.sum(y[1:])
N = 10
with pm.Model() as model:
    pm.Normal('y', mu=np.zeros(N), sd=1, shape=N, 
              transform=Ordered(), testval=np.arange(N))
然后像这样使用它:

class Ordered(pymc3.distributions.transforms.ElemwiseTransform):
    name = "ordered"

    def forward(self, x):
        out = tt.zeros(x.shape)
        out = tt.inc_subtensor(out[0], x[0])
        out = tt.inc_subtensor(out[1:], tt.log(x[1:] - x[:-1]))
        return out

    def backward(self, y):
        out = tt.zeros(y.shape)
        out = tt.inc_subtensor(out[0], y[0])
        out = tt.inc_subtensor(out[1:], tt.exp(y[1:]))
        return tt.cumsum(out)

    def jacobian_det(self, y):
        return tt.sum(y[1:])
N = 10
with pm.Model() as model:
    pm.Normal('y', mu=np.zeros(N), sd=1, shape=N, 
              transform=Ordered(), testval=np.arange(N))
编辑:关于此处发生的情况的简短说明:

我们定义了一个从$R^n$到有序序列集的映射

f(x_1) = x_1,\quad f(x_i) = f(x_{i - 1}) + exp(x_i)
因为这是一个很好的双射函数,我们可以通过

P_{R^n}(x) = P_{ordered}(f(x)) \cdot |J_{f(x)}|
其中J是变换的雅可比矩阵

采样器将只看到未受约束的值。这就是
Bound
最初的实现方式


如果你想要更多的细节,你可以看一下。它包含了这些转换的详细描述,pymc3和stan的数学原理相同。

谢谢!我运行了一个简单的采样,顺序约束似乎满足了,尽管我不确定那里发生了什么。甚至不知道有一个
transform
参数。。期待你的公关!谢谢我运行了一个简单的采样,顺序约束似乎满足了,尽管我不确定那里发生了什么。甚至不知道有一个
transform
参数。。期待你的公关!