我正在尝试使用numpy库在python中实现正向采样。我有一些变量保存条件概率表,我想从这些表中绘制一个随机样本。对于贝叶斯网络中的根,这段代码很简单:
ls = L.cumsum().searchsorted(random.sample(n))
其中L
是(C)PT作为(一维)numpy数组,n
是我想要采样的样本数。
现在我想对一个真实的条件概率表做同样的事情。不幸的是,之前的代码不再适用,因为我现在必须考虑所选的l
,这导致某些表具有两个维度,因此searchsorted()
无法处理它。 (例如P_L[:,ls].cumsum(0)
提供的数组看起来像[[.8 .8 ... ] [1. 1. ...]]
我找到了解决这个问题的方法:
randomness = random.sample(n)
ps = ndarray(ls.shape, int)
for i in 0,1 :
mask = ls == i
ps[mask] = P_L[:,i].cumsum().searchsorted(randomness[mask])
但我认为这是一种相当肮脏的方式,我想知道是否有人会知道如何以更体面/更干净的方式写出来。
提前致谢