到这里为止,通过调用 generateRules 函数即可得出我们所需的 关联规则。测试下结果:
def testGenerateRules(): # 加载测试数据集 dataSet = loadDataSet() print ('dataSet: ', dataSet) # Apriori 算法生成频繁项集以及它们的支持度 L1, supportData1 = apriori(dataSet, minSupport=0.5) print ('L(0.7): ', L1) print ('supportData(0.7): ', supportData1) # 生成关联规则 rules = generateRules(L1, supportData1, minConf=0.5) print ('rules: ', rules)运行结果如下:
dataSet: [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] L(0.7): [[frozenset({1}), frozenset({3}), frozenset({2}), frozenset({5})], [frozenset({3, 5}), frozenset({1, 3}), frozenset({2, 5}), frozenset({2, 3})], [frozenset({2, 3, 5})]] supportData(0.7): {frozenset({5}): 0.75, frozenset({3}): 0.75, frozenset({2, 3, 5}): 0.5, frozenset({1, 2}): 0.25, frozenset({1, 5}): 0.25, frozenset({3, 5}): 0.5, frozenset({4}): 0.25, frozenset({2, 3}): 0.5, frozenset({2, 5}): 0.75, frozenset({1}): 0.5, frozenset({1, 3}): 0.5, frozenset({2}): 0.75} frozenset({5}) --> frozenset({3}) conf: 0.6666666666666666 frozenset({3}) --> frozenset({5}) conf: 0.6666666666666666 frozenset({3}) --> frozenset({1}) conf: 0.6666666666666666 frozenset({1}) --> frozenset({3}) conf: 1.0 frozenset({5}) --> frozenset({2}) conf: 1.0 frozenset({2}) --> frozenset({5}) conf: 1.0 frozenset({3}) --> frozenset({2}) conf: 0.6666666666666666 frozenset({2}) --> frozenset({3}) conf: 0.6666666666666666 frozenset({5}) --> frozenset({2, 3}) conf: 0.6666666666666666 frozenset({3}) --> frozenset({2, 5}) conf: 0.6666666666666666 frozenset({2}) --> frozenset({3, 5}) conf: 0.6666666666666666 rules: [(frozenset({5}), frozenset({3}), 0.6666666666666666), (frozenset({3}), frozenset({5}), 0.6666666666666666), (frozenset({3}), frozenset({1}), 0.6666666666666666), (frozenset({1}), frozenset({3}), 1.0), (frozenset({5}), frozenset({2}), 1.0), (frozenset({2}), frozenset({5}), 1.0), (frozenset({3}), frozenset({2}), 0.6666666666666666), (frozenset({2}), frozenset({3}), 0.6666666666666666), (frozenset({5}), frozenset({2, 3}), 0.6666666666666666), (frozenset({3}), frozenset({2, 5}), 0.6666666666666666), (frozenset({2}), frozenset({3, 5}), 0.6666666666666666)] 实际应用:发现毒蘑菇的相似特性 实际需求菌类蘑菇食用对人体有益,现在市场上很受欢迎。假设你在一个山林里,遇到很多蘑菇,有些可以食用有些有毒。此刻,你或许会询问山中常驻居民,居民非常友好的告诉你伞菇上有彩色花斑的,样式好看的等等有毒。他会通过判断蘑菇的大小,高度,颜色,形状等23个特征决定蘑菇有毒,我把将居民的经验收集在mushromm.dat里面,以下是部分数据:
1 3 9 13 23 25 34 36 38 40 52 54 59 63 67 76 85 86 90 93 98 107 113 2 3 9 14 23 26 34 36 39 40 52 55 59 63 67 76 85 86 90 93 99 108 114 2 4 9 15 23 27 34 36 39 41 52 55 59 63 67 76 85 86 90 93 99 108 115其中第一列1代表可以食用2代表有毒。其他各列代表不同特征。实际中,我们不可能对比23个特征,我们只需要找出毒蘑菇特有的几个特征即可,比如颜色彩色,形状方形等。我们自然语言描述很容易,就是看到蘑菇,对比下毒蘑菇的几个特征,不具备就可以采摘食用了。
到目前为止,我们清楚的采用毒蘑菇共同特征判断,那么如何知道毒蘑菇共同特征呢?我们就可以使用本节学习的先验算法Apriori进行关联规则找出毒蘑菇的共同特性。
算法实现得到数据集
dataSet = [line.split() for line in open("./mushroom.dat").readlines()]利用我们的先验算法计算L频繁项集和所有元素支持度的全集
L, supportData = apriori(dataSet, minSupport=0.4)找出关于2的频繁子项,就知道如果是毒蘑菇,那么出现频繁的也可能是毒蘑菇
for item in L[2]: if item.intersection('2'): print (item) 毒蘑菇的相似特性运行结果 frozenset({'59', '39', '2'}) frozenset({'59', '85', '2'}) frozenset({'34', '39', '2'}) frozenset({'90', '86', '2'}) frozenset({'34', '90', '2'}) frozenset({'39', '86', '2'}) frozenset({'85', '28', '2'}) frozenset({'59', '86&##39;, '2'}) frozenset({'34', '85', '2'}) frozenset({'90', '39', '2'}) frozenset({'39', '85', '2'}) frozenset({'34', '59', '2'}) frozenset({'34', '86', '2'}) frozenset({'90', '59', '2'}) frozenset({'85', '86', '2'}) frozenset({'90', '85', '2'}) frozenset({'63', '85', '2'})如上结果显示,遇到如上特征就很可能是毒蘑菇不能食用的啦。我们上面实验设置的2-频繁项集,根据实际需要可以调整k-频繁项集。
参考文献数据挖掘十大算法:https://wizardforcel.gitbooks.io/dm-algo-top10/content/apriori.html
中文维基百科:https://zh.wikipedia.org/wiki/%E5%85%88%E9%AA%8C%E7%AE%97%E6%B3%95
GitHub:https://github.com/BaiNingchao/MachineLearning-1
图书:《机器学习实战》
图书:《自然语言处理理论与实战》
完整代码下载