Apriori算法实战-福彩双色球
Apriori算法是数据挖掘的入门级算法,这里记录一下用Weka提供的Apriori实现对福彩双色球开奖结果的挖掘过程。
我们的挖掘目标是历届开奖结果中红球的频繁2,3项集。
1. 数据准备
福彩双色球的原理是红球33选6,蓝球是16选1,历届福彩双色球的中奖结果可以在乐彩网站找到,我们可以用一个非常简单的爬虫去爬取这些数据。我这里有已经爬好的数据,从2003年2月23号的第一期开始,到2012年10月24号为止,总共1403期,可以来信(kemaswill@163.com)索取。
双色球是从红球中33选6,所以条记录只有6个数,假设为3,7,11,18,25,29,我们需要对这种记录进行预处理以便Weka的Apriori算法识别,该记录处理后的结果为0,0,3,0,0,0,7,0,0,0,11,0,0,0,0,0,0,18,0,0,0,0,0,0,25,0,0,0,29,0,0,0,0。
对每条记录做如上处理后,创建arff文件:
@relation lottery
@attribute red1 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}
@attribute red2 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}
@attribute red3 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}
...
@attribute red32 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}
@attribute red33 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}
@data
0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,28,0,30,31,0,33
0,0,0,0,0,0,0,0,0,0,0,0,0,14,15,0,0,18,0,0,0,0,0,0,25,26,0,0,0,30,0,0,0
0,0,0,0,0,0,0,0,0,10,11,12,13,0,0,0,0,0,0,0,0,0,0,0,0,26,0,28,0,0,0,0,0
0,0,0,4,0,0,0,0,9,0,0,0,0,0,0,0,0,0,19,20,21,0,0,0,0,26,0,0,0,0,0,0,0
...
2. 运行Apriori算法
我是在Eclipse中导入Weka的源代码,然后直接执行weka.association.Apriori算法,参数为:
-t path/to/lottery.arff -g path/to/lottery_result.txt -C 0.3 -M 0.01 -I -Z
-t为arff输入文件,-g为结果的存储路径,-C为关联规则的最小可信度,-M为频繁模式的最小支持度,-I表示输出频繁模式(默认只输出关联规则,不输出频繁模式),-Z表示0代表缺失值,不会被当做频繁模式处理。
3. 分析结果
在支持度为1%的情况下,所有的2项集都是频繁二项集(亦即33*32/2=528个频繁二项集)。
频繁三项集有6个:
red1=1 red18=18 red22=22 14
red3=3 red7=7 red10=10 16
red3=3 red7=7 red13=13 14
red3=3 red24=24 red27=27 14
red4=4 red10=10 red26=26 15
red4=4 red22=22 red29=29 14
在支持度为4%的情况下,没有频繁三项集(最频繁的三项集频数也就是16,也就1%多一点点)有8个频繁二项集:
red1=1 red18=18 58
red3=3 red5=5 66
red3=3 red7=7 61
red3=3 red21=21 56
red4=4 red30=30 56
red14=14 red30=30 56
red18=18 red30=30 59
red20=20 red26=26 59