我有两个高斯分布(我使用multivariate_normal
),我想从中抽取第一个高斯分布的概率为p
,而另一个高斯分布的概率为1-p
。我想抽n
。
是否可以在没有for
循环的情况下做到这一点? (出于效率目的)
谢谢
答案 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
中。