我试图在一个简单的贝叶斯网络上进行逆推理,以进行分段线性回归 . 也就是说,y是x的分段线性函数:Plot of Y vs X

和贝叶斯网络看起来像这样:Bayesian Network Model

这里,X具有正态分布,K是具有以X为条件的softmax分布的离散节点,Y是基于K的值的线性高斯的混合(即Pr(Y | K = i,X = x)〜 N(mu = w_i * x b_i,s_i)) . 我已经使用EM算法学习了这个模型的参数 . (Y和X的实际关系有五个线性部分,但我已经学会了使用8个级别作为离散节点) . 并使用这些参数形成了pymc模型 . 这是代码:

x=pymc.Normal('x', mu=0.5, tau=1.0/0.095)

#The probabilities of discrete node given x=x; Softmax distribution
epower = [-11.818,54.450,29.270,-13.038,73.541,28.466,-57.530,-101.568]
bias = [7.8228,-35.3859,-12.9512,12.8004,-48.1097,-13.2229,30.6079,39.3811]
@pymc.deterministic(plot=False)
def prob(epower=epower,bias=bias,x=x):
    pr=[np.exp(ep*x+bb) for ep, bb in zip(epower, bias)]
    return [pri/np.sum(pr) for pri in pr] 
knode=pymc.Categorical('knode', p=prob)

#The weights of regression 
wtsY=[15.022, -70.000, -14.996,  15.026, -70.000, -14.996,  34.937,  15.027]
#The unconditional means of Y
meansY=[5.9881,68.0000,23.9973,5.9861,68.0000,23.9972,-1.9809,1.9982]
sigmasY=[0.010189,0.010000,0.010033,0.010211,0.010000,0.010036,0.010380,0.010167]
@pymc.deterministic(plot=False)
def condmeanY(knode=knode, x=x,wtsY=wtsY, meansY=meansY):
    return wtsY[knode]*x + meansY[knode]
@pymc.deterministic(plot=False)
def condsigmaY(knode=knode, sigmasY=sigmasY):
    return sigmasY[knode]
y=pymc.Normal('y', mu=condmeanY, tau=1.0/condsigmaY, value=13.5, observed=True)

当观察到y时,我想预测x(逆推断) . 由于y在x中是(近似)非线性的,因此对于给定的y值将存在多个解 . 我希望获得的x的痕迹应该显示那些多个解决方案 . 我确保自相关非常低(样本= 2000,刻录= 1000) . 但我无法看到多种解决方案 . 在上面的例子中,对于y = 13.5,有两种可能的解,x = 0.5和x = 0.7 . 但该连锁店仅在0.5附近徘徊 . 直方图只有一个峰值,为0.5 .

我错过了什么吗?

编辑:我遇到了这个非常相关的问题:Solving inverse problems with PyMC . 我从答案中学到的是x的先验,我假设在这里是单模高斯,应该具有非参数分布,然后可以使用第一次迭代后获得的样本来更新它 . 已经建议使用核密度估计(使用高斯核)从数据中获得非参数随机性 . 我在我的模型中加入了这个,但仍然没有区别 . 我注意到的一件事是,如果我多次进行推理,大约50%的时间,我得到0.5和50%的时间,我得到0.7(我不确定这是否也是早期的情况,因为我没多次运行那个模型来观察它 . )但是,在第一次迭代之后,我是否应该在迹线中看不到两个峰值?

我也试过这个模型的修改版本,其中从X到K的边缘是相反的 . 这是一个经典的条件线性高斯模型 . 即使使用此模型,我也无法在跟踪中看到多个解决方案 . 我有点被困在这里 . 请帮忙 .