对于广泛的标题感到抱歉,我只是不知道如何命名。
我有一个整数列表,让我们说:
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()
生成每个组合,然后计算幻影的数量,但还有其他更好的方法吗?
感谢。
答案 0 :(得分:1)
不知道这是一种严格的更好的方式,或者更相似,但你可以尝试检查子集的外观分数。在蛮力的方式下,将结果存储在字典中。很可能,最好建一棵树,如果它的元素的出现率已经没有削减,你就不会在树枝上搜索。 (即如果(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不能自行排序。希望这会对你有所帮助。
答案 1 :(得分:1)
您正在寻找的方法称为
在给定一组集合的情况下,它找到了频繁的子集。