一组整数内的聚类分析

Cluster analysis within a set of integers

抱歉,标题太笼统了,我只是不知道如何命名。

我有一个整数列表,比方说:

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

作为编辑:您可能对所有非外观不感兴趣,所以我将添加一段代码来减少最终字典的大小。首先我们定义一个函数来 return a我们字典的浅拷贝,删除了 1 个值。这是为了在 dict.

循环时避免 RunTimeError
def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

然后我们去掉无关紧要的"clusters"

for d, v in dicter.items():
    if v < 0.1:
        dicter = removekey(dicter, d)

它仍将是未排序的,因为 itertools 和集合不会自行排序。希望这对你有帮助。

您正在寻找的方法叫做

频繁项集挖掘

它根据给定的集合列表找到频繁子集。