我有一个我们在内部生成的彩票样式数据集(下面的示例)。我试图找出哪些数字最常一起出现。示例问题:最常一起出现的前 10 对数字是什么?最常一起出现的前 10 个三个数字是什么?
我需要使用什么方法/技术来回答这些问题?
起初我在考虑集群,但我执行的测试运行(病房)没有返回我期望的结果。

我有一个我们在内部生成的彩票样式数据集(下面的示例)。我试图找出哪些数字最常一起出现。示例问题:最常一起出现的前 10 对数字是什么?最常一起出现的前 10 个三个数字是什么?
我需要使用什么方法/技术来回答这些问题?
起初我在考虑集群,但我执行的测试运行(病房)没有返回我期望的结果。

这个问题要求对序列计数问题的解决方案进行修改:如评论中所述,它要求对同时出现的值进行交叉制表。
R我将用代码说明一个幼稚但有效的修改。首先,让我们介绍一个可以使用的小样本数据集。它采用通常的矩阵格式,每行一个案例。
x <- matrix(c(3,5,7,10,13,
3,5,8,10,15,
2,5,10,11,18,
1,3,4,6,8,
2,4,6,12,14,
3,5,8,10,15),
ncol=5, byrow=TRUE)
此解决方案一次生成项(每行)的所有可能组合并将它们制成表格:
m <- 3
x <- t(apply(x, 1, sort))
x0 <- apply(x, 1, combn, m=m)
y <- array(x0, c(m, length(x0)/(m*dim(x)[1]), dim(x)[1]))
ngrams <- apply(y, c(2,3), function(s) paste("(", paste(s, collapse=","), ")", sep=""))
z <- sort(table(as.factor(ngrams)), decreasing=TRUE)
列表在 中z,按频率降序排列。它本身很有用或易于后处理。以下是示例的前几个条目:
> head(z, 10)
(3,5,10) (3,10,15) (3,5,15) (3,5,8) ... (8,10,15)
3 2 2 2 ... 2
这效率如何?对于列,需要组合,对于固定:这非常糟糕,因此我们仅限于相对较少的列数。为了了解时间,用一个小的随机矩阵重复前面的步骤并计时。让我们坚持使用到例如:
n.col <- 8 # Number of columns
n.cases <- 10^3 # Number of rows
x <- matrix(sample.int(20, size=n.col*n.cases, replace=TRUE), ncol=n.col)
该操作用了两秒钟将行和组合制成表格。(通过对组合进行数字编码而不是字符串编码,它可以快一个数量级;这仅限于小到可以精确表示为整数或浮点数的情况,将其限制为大约 .) 它随行数线性缩放。(将可能值的数量从增加到只会稍微延长时间。)如果这表明处理特定数据集的时间过长,那么将需要一种更复杂的方法,可能会利用非常小的限制计算和计数的高阶组合。
您不是在寻找聚类。
相反,您正在寻找频繁项集挖掘。有几十种算法,最广为人知的可能是 APRIORI、FP-Growth 和 Eclat。
我使用一个简单的 Excel 电子表格并加载所有绘图,然后进行数据排序。当您进行数据排序时,您可以快速了解哪些数字永远不会和从未一起玩过。我还编写了可以运行对和 3 对的宏。