如何根据某些伯努利分布有条件地从两个不同的高斯中得出?

时间:2018-12-26 22:10:10

标签: python-3.x numpy scipy

我有两个高斯分布(我使用multivariate_normal),我想从中抽取第一个高斯分布的概率为p,而另一个高斯分布的概率为1-p 。我想抽n

是否可以在没有for循环的情况下做到这一点? (出于效率目的)

谢谢

1 个答案:

答案 0 :(得分:1)

是的,可以执行此操作而无需循环。试试:

import numpy as np
from scipy import stats

sample_size = 100
p = 0.25

# Flip a coin with P(HEADS) = p to determine which distribution to draw from
indicators = stats.bernoulli.rvs(p, size=sample_size)

# Draw from N(0, 1) w/ probability p and N(-1, 1) w/ probability (1-p)
draws = (indicators == 1) * np.random.normal(0, 1, size=sample_size) + \
    (indicators == 0) * np.random.normal(-1, 1, size=sample_size)

您可以使用np.vectorize (caveat emptor)完成同一件事:

def draw(x):
  if x == 0:
     return np.random.normal(-1, 1)
  elif x == 1:
     return np.random.normal(0, 1)

draw_vec = np.vectorize(draw)    
draws = draw_vec(indicators)

如果您需要将解决方案扩展到两个以上分布的混合,则可以使用np.random.multinomial将示例分配给分布,并将其他案例添加到if/else中的draw中。