pymc - pymc3 多项式混合卡住了
问题描述
我正在尝试使用 PYMC3 来实现一个数据来自多项式混合的示例。目标是推断底层state_prob
向量(见下文)。代码运行,但 Metropolis 采样器卡在初始state_prior
向量上。此外,由于某种原因,我无法让 NUTS 工作。
import numpy as np
import pandas as pd
from pymc3 import Model, Multinomial, Dirichlet
import pymc3
import theano.tensor as tt
from theano import function, printing
N = 10
state_prior = np.array([.3, .3, .3])
state_prob = np.array([0.3, 0.1, 0.6]) #need to infer this
state_emission_tran = np.array([[0.3, 0.2, 0.5],
[0.1, 0.5, 0.4],
[0.0, 0.05, 0.95]])
state_data = np.random.multinomial(1, state_prob, size=N)
emission_prob_given_state = np.matmul(state_data, state_emission_tran)
def rand_mult(row_p):
return np.random.multinomial(1, row_p)
emission_data = np.apply_along_axis(rand_mult, 1, emission_prob_given_state)
# done with creating data
with Model() as simple_dag:
state = Dirichlet('state', state_prior*100, shape=3)
emission_dist = [pymc3.Multinomial.dist(p=state_emission_tran[i], n=1, shape=3) for i in range(3)]
emission_mix = pymc3.Mixture('emission_mix', w = state, comp_dists = emission_dist, observed=emission_data)
with simple_dag:
step = pymc3.Metropolis(vars=[state])
trace = pymc3.sample(10000, cores=2, chains=2, tune=500, step=step, progressbar=True)
解决方案
试试这个:
import numpy as np
import pandas as pd
from pymc3 import Model, Multinomial, Dirichlet
import pymc3
import theano.tensor as tt
from theano import function, printing
N = 10
state_prior = np.array([.3, .3, .3])
state_prob = np.array([0.3, 0.1, 0.6]) #need to infer this
state_emission_tran = np.array([[0.3, 0.2, 0.5],
[0.1, 0.5, 0.4],
[0.0, 0.05, 0.95]])
state_data = np.random.multinomial(1, state_prob, size=N)
emission_prob_given_state = np.matmul(state_data, state_emission_tran)
def rand_mult(row_p):
return np.random.multinomial(1, row_p)
emission_data = np.apply_along_axis(rand_mult, 1, emission_prob_given_state)
# done with creating data
with Model() as simple_dag:
state = Dirichlet('state', state_prior*100, shape=3)
emission_dist = [pymc3.Multinomial.dist(p=state_emission_tran[i], n=1, shape=3) for i in range(3)]
emission_mix = pymc3.Mixture('emission_mix', w = state, comp_dists = emission_dist, observed=emission_data)
with simple_dag:
trace = pymc3.sample(3000, tune=1000)
我pymc3
在 Linux 中使用 3.5 版,它工作正常。
推荐阅读
- ubuntu-16.04 - 传输 3.0 更新 (Ubuntu 16.04) - 使用错误的设置文件夹
- javascript - 如何根据用户先前的输入更改选择哪个选项
- vb.net - 如何防止我的 VB 应用程序崩溃
- python-3.x - python:试图在getter中设置值,结果对象没有属性
- javascript - 如何改变 Javascript/Html 画布图像的色调
- c++ - 在 xcode 上使用 stdlib.h
- electron - 在 Electron 中使用“另存为”对话框创建和保存文本文件
- python - 我无法在win10上安装tensorflow
- actions-on-google - 构建后找不到 Google 本地执行的节点/Web 子目录
- swift - 设置模板参数默认值