在PyMC3中,通过set_data()
传递的单个新观测值当前未被sample_posterior_predictive()
正确处理,在这种情况下,它将预测训练数据(参见#3640)。因此,我决定在输入数据中添加第二个与第一个相同的人工行,以绕过此行为。你知道吗
现在,我偶然发现了一件我目前还没有弄明白的事情:第一排和第二排的预测是不同的。如果有一个常数random_seed
,我会认为这两个预测是相同的。有人能(i)确认这是预期的行为而不是bug,如果是的话,(ii)解释为什么sample_posterior_predictive()
会为同一个输入数据创建不同的结果吗?你知道吗
下面是一个基于虹膜数据集的可复制示例,其中花瓣宽度和长度分别作为预测值和响应值,除了最后一行之外的所有内容都用于训练。随后对最后一行进行模型测试。pd.concat()
用于复制测试数据帧的第一行,以避免上述错误。你知道吗
import seaborn as sns
import pymc3 as pm
import pandas as pd
import numpy as np
### . training ----
dat = sns.load_dataset('iris')
trn = dat.iloc[:-1]
with pm.Model() as model:
s_data = pm.Data('s_data', trn['petal_width'])
outcome = pm.glm.GLM(x = s_data, y = trn['petal_length'], labels = 'petal_width')
trace = pm.sample(500, cores = 1, random_seed = 1899)
### . testing ----
tst = dat.iloc[-1:]
tst = pd.concat([tst, tst], axis = 0, ignore_index = True)
with model:
pm.set_data({'s_data': tst['petal_width']})
ppc = pm.sample_posterior_predictive(trace, random_seed = 1900)
np.mean(ppc['y'], axis = 0)
# array([5.09585088, 5.08377112]) # mean predicted value for [first, second] row
我不认为这是一个错误,我也不觉得麻烦。由于PyMC3不检查被预测的点是否相同,它将它们分开处理,每个点都从模型中随机抽取。虽然每个PPC绘图(在
ppc['y']
中的行)对从记录道获取的GLM使用相同的随机参数设置,但是模型仍然是随机的(即,始终存在测量误差)。我想这就解释了区别。你知道吗如果你增加PPC中的抽签数,你会发现平均数的差异会减小,这与抽样中的差异是一致的。你知道吗
相关问题 更多 >
编程相关推荐