Python PyMC3多项式模型不适用于非整数观测数据
我试图用PyMC3来解一个相当简单的多项式分布。如果我将“噪波”值设置为0.0,它将非常有效。但是,当我将其更改为其他任何内容时,例如0.01,我在find_MAP函数中得到一个错误,如果我不使用find_MAP,它将挂起 多项式必须是稀疏的,这有什么原因吗Python PyMC3多项式模型不适用于非整数观测数据,python,pymc,pymc3,Python,Pymc,Pymc3,我试图用PyMC3来解一个相当简单的多项式分布。如果我将“噪波”值设置为0.0,它将非常有效。但是,当我将其更改为其他任何内容时,例如0.01,我在find_MAP函数中得到一个错误,如果我不使用find_MAP,它将挂起 多项式必须是稀疏的,这有什么原因吗 import numpy as np from pymc3 import * import pymc3 as mc import pandas as pd print 'pymc3 version: ' + mc.__version__
import numpy as np
from pymc3 import *
import pymc3 as mc
import pandas as pd
print 'pymc3 version: ' + mc.__version__
sample_size = 10
number_of_experiments = 1
true_probs = [0.2, 0.1, 0.3, 0.4]
k = len(true_probs)
noise = 0.0
y = np.random.multinomial(n=number_of_experiments, pvals=true_probs, size=sample_size)+noise
y_denominator = np.sum(y,axis=1)
y = y/y_denominator[:,None]
with Model() as multinom_test:
probs = Dirichlet('probs', a = np.ones(k), shape = k)
for i in range(sample_size):
data = Multinomial('data_%d' % (i),
n = y[i].sum(),
p = probs,
observed = y[i])
with multinom_test:
start = find_MAP()
trace = sample(5000, Slice())
trace[probs].mean(0)
错误:
ValueError: Optimization error: max, logp or dlogp at max have non-
finite values. Some values may be outside of distribution support.
max: {'probs_stickbreaking_': array([ 0.00000000e+00, -4.47034834e-
08, 0.00000000e+00])} logp: array(-inf) dlogp: array([
0.00000000e+00, 2.98023221e-08, 0.00000000e+00])Check that 1) you
don't have hierarchical parameters, these will lead to points with
infinite density. 2) your distribution logp's are properly specified.
Specific issues:
这对我有用
样本量=10
实验次数=100
真概率=[0.2,0.1,0.3,0.4]
k=真实的问题
噪音=0.01
y=np.随机.多项式N=实验次数,pvals=真实概率,大小=样本大小+噪声
使用pm.Model作为multinom_测试:
a=pm.Dirichlet'a',a=np.onesk
对于i范围内的样本大小:
data_pred=pm.多项式'data_pred_%s'%i,n=实验次数,p=a,观测值=y[i]
trace=pm.sample50000,pm.Metropolis
trace=pm.sample1000也适用于螺母
pm.traceplottrace[500:];
这对我有用
样本量=10
实验次数=100
真概率=[0.2,0.1,0.3,0.4]
k=真实的问题
噪音=0.01
y=np.随机.多项式N=实验次数,pvals=真实概率,大小=样本大小+噪声
使用pm.Model作为multinom_测试:
a=pm.Dirichlet'a',a=np.onesk
对于i范围内的样本大小:
data_pred=pm.多项式'data_pred_%s'%i,n=实验次数,p=a,观测值=y[i]
trace=pm.sample50000,pm.Metropolis
trace=pm.sample1000也适用于螺母
pm.traceplottrace[500:];
试着写出这样的可能性:data_pred=pm.多项式'data_pred',n=实验次数,p=a,observed=y.你也可以尝试使用Metropolis而不是SliceHi aloctavodia.我甚至还没有达到示例步骤,所以我不认为Metropolis vs.Slice有问题。你能澄清一下你的似然函数吗?我有几个列,所以我使用数组符号[I]。你是说还有其他的方法来做这个操作吗?对不起,当我发表我的评论时,我假设通过传递p=a,然后是y,以正确广播a的可能性。事实上,模型运行,但样本似乎只来自于之前的,也就是说,它们似乎不受可能性的影响。试着写下这样的可能性:data_pred=pm。多项式'data_pred',n=实验次数,p=a,observed=y你也可以尝试使用Metropolis而不是SliceHi aloctavodia,我甚至没有进入示例步骤,所以我不认为这是Metropolis vs.Slice的问题。你能澄清一下你的似然函数吗?我有几个列,所以我使用数组符号[I]。你是说还有其他的方法来做这个操作吗?对不起,当我发表我的评论时,我假设通过传递p=a,然后是y,以正确广播a的可能性。事实上,模型是运行的,但样本似乎只是来自先前的,也就是说,它们似乎不受可能性的影响。这是有效的。我的代码似乎存在设置n=y[i].sum的问题。我不知道为什么这很重要,因为它提供了与实验数量相同的值,但现在它起作用了。谢谢请注意,y[i].sum=numberofuof\u仅在noise=0的情况下进行实验。这是有效的。我的代码似乎存在设置n=y[i].sum的问题。我不知道为什么这很重要,因为它提供了与实验数量相同的值,但现在它起作用了。谢谢请注意,y[i].sum=numberofuofuofuu只针对noise=0的实验。