对不起广泛的标题,我只是不知道如何命名这个。
我有一个整数列表,让我们说:
X = [20, 30, 40, 50, 60, 70, 80, 100]
并且从这个整数中得到第二个大小为2到6的元组列表:
Y = [(20, 30), (40, 50, 80, 100), (100, 100, 100), ...]
有些数字经常在Y
回来,我想确定经常回来的整数组。
现在,我正在计算每个整数的幻影数量。它给了我一些信息,但没有关于团体的信息。
例:
Y = [(20, 40, 80), (30, 60, 80), (60, 80, 100), (60, 80, 100, 20), (40, 60, 80, 20, 100), ...]
在那个例子中,(60, 80)
和(60, 80, 100)
是经常回来的组合。
我可以使用itertools.combinations_with_replacement()
生成每个组合,然后计算幻影的数量,但有没有其他更好的方法来做到这一点?
谢谢。
不知道它是否是一种严格的更好的方式,或者更相似,但你可以尝试检查子集的外观分数。在蛮力的方式下,将结果存储在字典中。很可能,如果它的元素的出现率已经没有进行切割,那么构建一个不用搜索分支的树会更好。 (即如果(20,80)不经常出现在一起,那么为什么要搜索(20,80,100)?)
N=len(Y)
dicter = {}
for i in range(2,7):
for comb in itertools.combinations(X,i):
c3 = set(comb)
d3 = sum([c3.issubset(set(val)) for val in Y])/N
dicter['{}'.format(c3)] = d3
编辑:你可能对所有非外观都不感兴趣,所以我会抛出一段代码来砍掉最后的字典大小。首先我们定义一个函数来返回我们字典的浅表副本,删除了1个值。这是在RunTimeError
上循环时避免dict
所必需的。
def removekey(d, key):
r = dict(d)
del r[key]
return r
然后我们删除无关紧要的“集群”
for d, v in dicter.items():
if v < 0.1:
dicter = removekey(dicter, d)
它仍然是未分类的,因为itertools和sets不能自行排序。希望这会对你有所帮助。
您正在寻找的方法被称为
在给定集合列表的情况下,它找到频繁的子集。