鉴于一系列传入的项目,我想将每个项目分配给一个存储桶。存储桶可以是一个新的(一个以前从未使用过的,其中有无限供应)或者它可以是现有的桶。如果我查看一个项目的桶数,两个数字,三个数字等,我希望那些桶数遵循指数分布。我希望我说得对 - 如果80%的桶有1个项目,那么16%应该有2个,3.2%应该有3个等等。一般来说,大小为k的桶的数量应该是1 / p与k-1大小的桶数一样多,大小为1的桶的比例应为(1-p),以使数学运算正常。
如果我事先知道了物品的数量,那就很容易了:我知道每种尺寸的桶数,所以我可以将物品堆放到我需要的每个尺寸的桶中。或者,如果我只是生成铲斗尺寸,即使我事先并不知道总数,也很容易:每个新铲斗的概率(1-p)为1,大小为(1-p)p 2,(1-p)p ^ 2大小3,(1-p)p ^ 3大小4等。
但是我正在处理项目,所以当我收到一个项目时,我需要选择一个存储桶:现有存储桶或新存储桶。如果我制作一个新的桶,那么我会得到一个大小为1.但是如果我选择一个大小为k的现有的那个,那么我再获得一个大小为k + 1的桶,以及一个更少的桶大小k。那么选择大小为k的桶的概率应该是多少(其中k可以为零以表示制作新桶)?它与p有什么关系?
我这样做是为了生成测试数据,我只知道每个桶的平均项目数(1.5,事实证明),不知道项目的数量,并认为桶大小的指数分布对我的情况来说是现实的。我可能会让它变得比它需要的更复杂,但我很惊讶,因为我认为这很容易。
也许是这样,但我只是遗漏了一些东西。 (而且我无法弄清楚如何谷歌它。)
答案 0 :(得分:4)
指数分布对整个正实体有支持;你的分布对正整数有支持(它是一个离散的概率分布),它被称为geometric distribution。 (W) [概率通常以1-(你的p)的参数来表示,但这是一个微不足道的细节。]
实际上,当你只知道平均值时,你选择几何分布是很好的选择:
在具有给定期望值μ的{1,2,3,...}上支持的所有离散概率分布中,具有参数p = 1 /μ的几何分布X是具有最大熵的几何分布。
你的问题很有意思(如果在给定大小分布的情况下如何逐步填充存储桶),我不知道最佳答案,但假设有足够多的项目,以下愚蠢的算法将起作用:
While there are items left:
Pick a "bucket size" k according to the desired distribution
/* E.g., for the geometric distribution with mean 1.5,
you could toss a coin with bias 0.667 until you get a head,
then you'll get k=1 for 66.7% of the time, k=2 for 22.2%, k=3 for 7.4% etc.,
with k being 1.5 on average (in expectation) */
Put the next k items into one (new) bucket.
请注意,您无需知道项目数。假设数量足够大,问题(例如分布的差异和最后的“剩余”)将无关紧要。
答案 1 :(得分:1)
这是我的两分钱:当您阅读项目时,保留一个桶和项目的计数器,并使用它来计算每个桶的项目数。如果items / buckets阈值超过1.5,则将下一个项目放入新存储桶中。如果没有,则将下一个项目分配给随机选择的现有存储桶。
大多数随机数生成器努力生成统计上可能的随机数集(例如,它们避免生成模式),因此我的数学直觉表明这应该足以满足您的需要。
答案 2 :(得分:0)
我将如何做到这一点。
对于每个进入的项目,从(0,1)上的均匀分布中绘制一个数字。这是您的CDF for the geometric distribution,正如上面提到的那样,您正在寻找的是什么。然后你想要的桶是ln((1-CDF)/(1-p))。假设您到目前为止只在桶1和2中放置了项目,然后您获得了一个目标为桶5的项目,没问题,只需使用哈希表来跟踪到目前为止已填充的桶。