我试图在一个简单的贝叶斯网络上进行逆推理,以进行分段线性回归。也就是说,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的边缘相反。这是一个经典的条件线性高斯模型。即使使用此模型,我也无法在跟踪中看到多个解决方案。我有点被困在这里。请帮忙。