获得最大的';多样化';Python中列表中的一组对?

获得最大的';多样化';Python中列表中的一组对?,python,algorithm,list,combinations,probability,Python,Algorithm,List,Combinations,Probability,我在python中有一个长度为N的列表,我想从中选择K对元素,其中不允许在一对中重复元素,并且(x,y)==(y,x)(顺序不敏感)。有N选择2对可能,并且K总是明显小于N。从列表中选择最“多样化”和最具代表性的对集的一种好的确定性(无抽样)方法是什么,这意味着:(1)表示列表中项目数量最多的对集(并且对任何特定元素都没有偏差),(2)在哪里,配对列表不偏向列表的开始或结束 例如: l = [1,2,3,4,5] 有5种选择2=10种可能的组合。如果我们要求2对(K=2),一组好的对将是[(1

我在python中有一个长度为N的列表,我想从中选择K对元素,其中不允许在一对中重复元素,并且
(x,y)==(y,x)
(顺序不敏感)。有N选择2对可能,并且K总是明显小于N。从列表中选择最“多样化”和最具代表性的对集的一种好的确定性(无抽样)方法是什么,这意味着:(1)表示列表中项目数量最多的对集(并且对任何特定元素都没有偏差),(2)在哪里,配对列表不偏向列表的开始或结束

例如:

l = [1,2,3,4,5]
有5种选择2=10种可能的组合。如果我们要求2对(K=2),一组好的对将是
[(1,2),(3,4)]
,因为几乎每个元素都出现在列表中,我们没有任何元素的重复。K=2的坏的对集应该是:
[(1,2)、(1,3)]
,因为它重用了1元素,并且明显偏向于列表的开头。如果K>2,在这种情况下,我们需要重复元素,这是不可避免的,但我想找到一种方法,即代表性/多样性wrt列表

我只是在寻找一种有效且简单的启发式方法,不必是完美的。有什么想法吗


很高兴使用numpy/scipy进行此操作。

从a中获取第一个K匹配?使用伪随机Fisher排列列表–Yates使用确定性种子进行洗牌,以避免偏向末尾。

您至少需要某种伪随机采样,否则在重新运行成对采样代码时,无论是偏向开头还是结尾,还是其他地方,都会出现某种“偏向”。如果K小于N/2,并且N不是太大(比如说1亿或更小),那么可以使用下面的python代码,这可以避免重复的采样调用,因为它一次生成K个psuedo随机对,从而避免重复

import random

X = range(N)

random.seed() # uses system time to initialize random number generator, or you can pass in a deterministic seed as an argument if you want

# code to use to generate K pairs
A = random.sample(X,2*K) # now you have a list of 2*K unique elements from 0 to N-1
pairs = zip(A[0:K],A[K:(2*K)]) # now you have your pairs
现在,如果K大于N/2,那么就必须有重复项,但是可以通过简单地在循环中重新运行类似于上面2行的代码来最小化类似于上面的重复项。如果N是奇数,这会造成麻烦,但一个简单的非常接近的近似策略是重复生成地板(N/2)对(避免重复),每次只保留一个未使用的数字。代码如下:

pairs = []
M = N
if M % 2 == 1:
  M -= 1
while len(pairs) < K:
  B = random.sample(X,M)
  A = zip(B[0:(M/2)],B[(M/2):M])
  pairs.extend(A)
pairs = pairs[0:K]
pairs=[]
M=N
如果M%2==1:
M-=1
而len(pairs)
5!/(2!(5 - 2)!) = 10@aaronman不,你去(n!)/(k!(n-k)!)。问题:计算每个项目在列表中出现的频率,根据每个数字的多重性分配概率。确定项目集的顺序(没有重复项),并根据其概率从该顺序列表中选择项目。每次拾取后调整多重性,冲洗并重复。一个类似的问题可能会帮助你。或者只是。更严重的是,什么是确定性的原因?用一颗已知的种子洗牌就足够了吗?@保罗:谷歌什么?使用已知种子进行洗牌是可以的,但当K明显小于N时,这不是一个很好的解决方案选择2,并且您可以保证不必重复elements@user248237dfsf抱歉,谷歌的建议是5选择2等于10(这只是个玩笑)。@user248237dfsf No,注意,您不必初始化X=range(N),X可以是长度为N的任意列表(如果您已经有了)