如何找出数据集中经常一起出现的数字?

机器算法验证 r 聚类 频率
2022-03-28 05:05:17

我有一个我们在内部生成的彩票样式数据集(下面的示例)。我试图找出哪些数字最常一起出现。示例问题:最常一起出现的前 10 对数字是什么?最常一起出现的前 10 个三个数字是什么?

我需要使用什么方法/技术来回答这些问题?

起初我在考虑集群,但我执行的测试运行(病房)没有返回我期望的结果。

在此处输入图像描述

3个回答

这个问题要求对序列计数问题的解决方案进行修改:如评论中所述,它要求对同时出现的值进行交叉制表。

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

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

这效率如何?对于列,需要组合,对于固定:这非常糟糕,因此我们仅限于相对较少的列数。为了了解时间,用一个小的随机矩阵重复前面的步骤并计时。让我们坚持使用例如:p(pm)O(pm)m120,

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)

该操作用了两秒钟将行和组合制成表格(通过对组合进行数字编码而不是字符串编码,它可以快一个数量级;这仅限于小到可以精确表示为整数或浮点数的情况,将其限制为大约 .) 它随行数线性缩放。(将可能值的数量从增加到只会稍微延长时间。)如果这表明处理特定数据集的时间过长,那么将需要一种更复杂的方法,可能会利用非常小的m=310008(pm)10162020,000m限制计算和计数的高阶组合。

您不是在寻找聚类。

相反,您正在寻找频繁项集挖掘有几十种算法,最广为人知的可能是 APRIORI、FP-Growth 和 Eclat。

我使用一个简单的 Excel 电子表格并加载所有绘图,然后进行数据排序。当您进行数据排序时,您可以快速了解哪些数字永远不会和从未一起玩过。我还编写了可以运行对和 3 对的宏。