Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python以不同的概率从不同的分布中采样_Python_Numpy_Probability_Sampling - Fatal编程技术网

python以不同的概率从不同的分布中采样

python以不同的概率从不同的分布中采样,python,numpy,probability,sampling,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

我正在尝试实现一个函数,它从三个不同的多元高斯分布返回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]]

有什么想法吗?

假设您创建了一个生成器阵列:

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]])]
现在,您可以创建生成器索引的加权随机数,因为它支持加权采样:

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]

我不能评论另一个答案,因为我没有足够的声誉,所以我的答案是一个改进意味着工作

当创建一个列表作为
[np.随机.多变量_正态([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包中的
multivariable\u 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]