一组整数内的聚类分析
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 和集合不会自行排序。希望这对你有帮助。
您正在寻找的方法叫做
频繁项集挖掘
它根据给定的集合列表找到频繁子集。
抱歉,标题太笼统了,我只是不知道如何命名。
我有一个整数列表,比方说:
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 和集合不会自行排序。希望这对你有帮助。
您正在寻找的方法叫做
频繁项集挖掘
它根据给定的集合列表找到频繁子集。