一组整数内的聚类分析

问题描述 投票:1回答:2

对不起广泛的标题,我只是不知道如何命名这个。

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

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()生成每个组合,然后计算幻影的数量,但有没有其他更好的方法来做到这一点?

谢谢。

python combinations cluster-analysis
2个回答
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
投票

您正在寻找的方法被称为

频繁项集挖掘

在给定集合列表的情况下,它找到频繁的子集。

© www.soinside.com 2019 - 2024. All rights reserved.