python 从不同分布以不同概率抽样
python sampling from different distributions with different probability
我正在尝试实现一个函数,其中 returns 来自三个不同多元高斯分布的 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]])]
现在您可以创建生成器索引的加权随机数,因为 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]
我无法评论其他答案,因为我没有足够的声誉,所以我的答案是一个有效的改进。
将列表创建为 [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
:
从中获取样本
# 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]
我正在尝试实现一个函数,其中 returns 来自三个不同多元高斯分布的 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]])]
现在您可以创建生成器索引的加权随机数,因为 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]
我无法评论其他答案,因为我没有足够的声誉,所以我的答案是一个有效的改进。
将列表创建为 [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
:
# 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]