Python 从多个集合中均匀采样

Python 从多个集合中均匀采样,python,math,numpy,Python,Math,Numpy,给定整数集{1,…,n},我想从大小为k的binom{n+k-1}{k}不同的多个子集中统一采样。有没有一种有效的方法 例如,集合{1,2,3}有6个大小为2的多子集。它们是{1,2},{2,3},{1,3},{1,1},{2,2},{3,3} 不幸的是,我现在无法测试我的解决方案,它基于上一个解决方案: import random as rd #n,k - should be predefined x=[[j]*k for j in xrange(n)] # [1,1,1,1 - k time

给定整数集{1,…,n},我想从大小为k的binom{n+k-1}{k}不同的多个子集中统一采样。有没有一种有效的方法


例如,集合{1,2,3}有6个大小为2的多子集。它们是{1,2},{2,3},{1,3},{1,1},{2,2},{3,3}

不幸的是,我现在无法测试我的解决方案,它基于上一个解决方案:

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)

对。既然你知道有(n+k-1)k个这样的多子集,你可能知道这个组合问题的解提供了这个公式。该问题的解决方案建议采用一种抽样程序来产生多个子集:随机选择一种方法来放置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
这将产生一个
集合。计数器
计算每个数字被选择的次数。我已经初始化了
bin_u=1
以生成{1…n}的多个子集
bin_u0
将生成{0…n-1}的多个子集


(之前,我发布了一个答案,建议使用多项式分布。这不是正确的分布;它对具有重复元素的结果的权重太小。对于错误,很抱歉。因为放置k星和n-1条的方法与{1…n}的多个子集直接对应。),此解决方案应产生均匀分布。)

您能给我举个例子吗?当涉及到数学符号或词汇时,我不是最好的,但是如果你能给我你想要实现的要点,也许我能帮上忙。你是说{1,…,n}的分区吗?参见。该页面也有很多例子。发布了一个答案,这次不应该是误导性的垃圾。我以前解决过这个问题;我应该记得多项式系数是错误的答案。