不同概率的不同分布的python采样

时间:2016-09-24 15:23:00

标签: python numpy probability sampling

我正在尝试实现一个从三个不同的多元高斯分布中返回100个样本的函数。

numpy提供了一种从多变量高斯采样的方法。但是我找不到从不同采样概率的三个不同多变量中采样的方法。

我的要求是从三位多变量高斯中抽取概率$ [0.7,0.2,0.1] $,其均值和协方差如下所示

G_1  mean = [1,1] cov =[ [ 5, 1] [1,5]]
G_2  mean = [0,0] cov =[ [ 5, 1] [1,5]]
G_3  mean = [-1,-1] cov =[ [ 5, 1] [1,5]]

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

假设您创建了一个生成器数组:

generators = [
    np.random.multivariate_normal([1, 1], [[5, 1], [1, 5]]),             
    np.random.multivariate_normal([0, 0], [[5, 1], [1, 5]]), 
    np.random.multivariate_normal([-1, -1], [[5, 1], [1, 5]])]

现在您可以创建生成器索引的加权随机数,因为np.random.choice支持加权采样:

draw = np.random.choice([0, 1, 2], 100, p=[0.7, 0.2, 0.1])

draw是一个长度为100的条目数组,每个条目来自 {0,1,2} ,概率 0.7,0.2,0.1 。)

现在只生成样本:

[generators[i] for i in draw]

答案 1 :(得分:0)

因为我没有足够的声誉,所以我无法评论其他答案,所以我的答案是一种改进,可以工作。

[np.random.multivariate_normal([1, 1], [[5, 1], [1, 5]])]的形式创建列表时,您要保留的样本来自多元正态分布,而不是分布本身。因此,每次程序为相同的generator[i]读取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方法从中获取样本:

# As before, I create the weighted random list of indeces:
draw = np.random.choice([0, 1, 2], 100, p=[0.7, 0.2, 0.1])
# And then I generate the random values, each one from a different distribuion
[generators[i].rvs() for i in draw]