在python中使用np.random.multinomial()

在python中使用np.random.multinomial(),python,random,Python,Random,我有一项任务,从阿尔法列表[a,b,c,d]的总体中随机选择100个元素,其频率(概率)[0.1,0.3,0.2,0.4]。 有很多不同的方法可以做到这一点。但在这里,我希望在这个函数调用(假设有一个)之后返回的是所选元素数量的列表。比如说,它返回(20,20,30,30),那么它意味着选择了元素a中的20个,选择了元素c中的20个,以此类推。 我认为np.random.multinomial是一个不错的选择。按照上面的例子,我需要调用函数np.random.multinomial(100,[0

我有一项任务,从阿尔法列表[a,b,c,d]的总体中随机选择100个元素,其频率(概率)[0.1,0.3,0.2,0.4]。 有很多不同的方法可以做到这一点。但在这里,我希望在这个函数调用(假设有一个)之后返回的是所选元素数量的列表。比如说,它返回(20,20,30,30),那么它意味着选择了元素a中的20个,选择了元素c中的20个,以此类推。 我认为np.random.multinomial是一个不错的选择。按照上面的例子,我需要调用函数np.random.multinomial(100,[0.1,0.3,0.2,0.4],1)。是这样吗?谢谢

相关的:
是的,
np.随机多项式(100,[0.1,0.3,0.2,0.4],1)
是正确的。但是由于你只画了一张图,你可能更喜欢简单的np.random.多项式(100,[0.1,0.3,0.2,0.4])(没有
,1
),它返回一个数组而不是一个数组的数组。

我同意JulienD的观点。“选择”这个词和给定的概率并不一致

  • 当使用“选择”时,我们指的是没有顺序的排列
  • 当使用给定的概率时,我们的意思是这些概率是恒定的(除非说明它是有条件的)。因此,项目被“分配”到具有给定概率的类别
当然,类别中的计数不是100*概率。这将是长期的预期价值。就像你扔出一枚公平的硬币,你不会期望它是HTHTHT…HT。但从长远来看,H的数量将占总投掷次数的一半

import numpy.random as npr
npr.seed(123)
npr.multinomial(100, [0.1,0.3,0.2,0.4], 1)
# Out: array([[11, 27, 18, 44]])
随着模拟次数的增加,概率将收敛到给定的概率

simulations = 1000
sum(npr.multinomial(100, [0.1,0.3,0.2,0.4], simulations))/simulations/100
#Out:array([ 0.09995,  0.29991,  0.19804,  0.4021 ])

为了实现目的,我希望这是正确的。但我感觉到有些不对劲。因为多项式分布更像是带替换的选择,因为概率首先是给定和固定的。对于这个问题,我想要的更像是选择而不替换,对吗?你的100个元素中的每一个最终都将属于4个类别中的一个,以给定的概率。这里没有替换的概念,因为您不是选择而是分配。把它想象成一棵树,每个分支上都有一个概率。选择和分配有什么区别?有两个不同的问题。您不需要类别来从100个元素中进行选择。从100个选项中选择10个:
np.random.choice(范围(100),10)
,您可以添加
replace=False
来绘制而不进行替换。但是你想在这里做的(以及用多项式做的)相当于np.random.choice(范围(4),100,replace=True,p=[0.1,0.3,0.2,0.4])那么,范围(4)意味着有4个类别?np.random.choice(范围(4),100,replace=True,p=[0.1,0.3,0.2,0.4])意味着在4个类别中,我们将选择100个元素?一般来说,我们并不关心整个人口中有多少元素?(假设总体是我们要从中选择100个元素的总体)。是这样吗?你看到我的评论了吗?我想要的是从一个包含10%元素a、30%元素b、20%元素c和40%元素d的总体中均匀随机地选择100个元素。你所做的选择是对类别的选择(四分之一,你选择100次),而不是对个人的选择,而是对替换的选择。未选择个人,而是将其分配到其中一个类别。