由于我声望不够,无法对其他答案进行评论,所以我的回答是一种改进方法。
当创建一个列表如 [np.random.multivariate_normal([1, 1], [[5, 1], [1, 5]])]
时,你是从多元正态分布中保留样本,而不是分布本身。因此,每次程序读取相同的 i
的 generator[i]
时,它会得到完全相同的值。因此,你将得到来自不同分布可能值的离散分布的样本,而不是多元正态分布的混合样本。
一个可行的方法是:
from scipy.stats import multivariate_normal
generators = [
multivariate_normal([1, 1], [[5, 1], [1, 5]]),
multivariate_normal([0, 0], [[5, 1], [1, 5]]),
multivariate_normal([-1, -1], [[5, 1], [1, 5]])]
现在我们使用来自scipy.stats包的multivariate_normal。与numpy.random中创建样本不同,它创建了一个关于分布的对象,我们可以使用rvs方法从中获取样本。请注意保留HTML标签。
draw = np.random.choice([0, 1, 2], 100, p=[0.7, 0.2, 0.1])
[generators[i].rvs() for i in draw]