python – 从multisets统一采样

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

最佳答案 是.既然你知道有(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}的多子集直接对应,该解决方案应该产生均匀分布.)

点赞