从多个集合中均匀地采样

时间:2013-12-28 11:45:01

标签: python math numpy

给定整数集{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}。

2 个答案:

答案 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)