给定整数集{1,...,n},我想从binom {n + k-1} {k}大小为k的不同多子集中均匀地采样。有没有一种有效的方法呢?
例如,集合{1,2,3}有6个大小为2的多子集。这些是{1,2},{2,3},{1,3},{1,1}, {2,2},{3,3}。
答案 0 :(得分:2)
是。既然你知道有(n + k-1)选择k这样的多子集,你可能会发现stars and bars组合问题,其解决方案提供了这个公式。这个问题的解决方案建议采用一个生成多子集的采样程序:随机选择放置k星和n-1条的方法,然后确定条形如何将星星划分成组:
import random
import collections
stars = set(random.sample(xrange(n+k-1), k))
multiset = collections.Counter()
# Don't hide the bin builtin.
bin_ = 1
for i in xrange(n+k-1):
if i in stars:
multiset[bin_] += 1
else:
bin_ += 1
这将生成一个collections.Counter
,计算每个数字的选择次数。我已初始化bin_ = 1
以生成{1 ... n}的多个子集; bin_ = 0
会生成{0 ... n-1}的多个子集。
(之前,我发布了一个答案,建议使用多项分布。这是不正确的分布;它对重复元素的结果给予的重量太小。抱歉错误。自从放置k星和n-1条的方法与{1 ... n}的多子集直接对应,这种解决方案应该产生均匀分布。)
答案 1 :(得分:0)
不幸的是我现在无法测试我的解决方案,它基于前一个解决方案:
import random as rd
#n,k - should be predefined
x=[[j]*k for j in xrange(n)] # [1,1,1,1 - k times, 2,2,2,- k times etc.]
rd.sample(x,k)