一组整数内的聚类分析

时间:2018-05-28 11:50:54

标签: python combinations cluster-analysis

对于广泛的标题感到抱歉,我只是不知道如何命名。

我有一个整数列表,让我们说:

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()生成每个组合,然后计算幻影的数量,但还有其他更好的方法吗?

感谢。

2 个答案:

答案 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)

您正在寻找的方法称为

频繁项目集挖掘

在给定一组集合的情况下,它找到了频繁的子集。