一步步教你轻松学关联规则Apriori算法 (5)

L1,k=2的运行结果:
[frozenset({1, 3}), frozenset({1, 2}), frozenset({1, 5}), frozenset({2, 3}), frozenset({3, 5}), frozenset({2, 5})]

第五步: 找出满足最小支持度的频繁项集。 '''找出数据集中支持度不小于最小支持度的候选项集以及它们的支持度即频繁项集。 算法思想:首先构建集合C1,然后扫描数据集来判断这些只有一个元素的项集是否满足最小支持度。满足最小支持度要求的项集构成集合L1。然后L1 中的元素相互组合成C2,C2再进一步过滤变成L2,以此类推,直到C_n的长度为0时结束,即可找出所有频繁项集的支持度。 返回:L 频繁项集的全集 supportData 所有元素和支持度的全集 ''' def apriori(dataSet, minSupport=0.5): # C1即对dataSet去重排序,然后转换所有的元素为frozenset C1 = createC1(dataSet) # 对每一行进行 set 转换,然后存放到集合中 D = list(map(set, dataSet)) # 计算候选数据集C1在数据集D中的支持度,并返回支持度大于minSupport 的数据 L1, supportData = scanD(D, C1, minSupport) # L 加了一层 list, L一共 2 层 list L = [L1];k = 2 # 判断L第k-2项的数据长度是否>0即频繁项集第一项。第一次执行时 L 为 [[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])]]。L[k-2]=L[0]=[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])],最后面 k += 1 while (len(L[k-2]) > 0): Ck = aprioriGen(L[k-2], k) # 例如: 以 {0},{1},{2} 为输入且 k = 2 则输出 {0,1}, {0,2}, {1,2}. 以 {0,1},{0,2},{1,2} 为输入且 k = 3 则输出 {0,1,2} # 返回候选数据集CK在数据集D中的支持度大于最小支持度的数据 Lk, supK = scanD(D, Ck, minSupport) # 保存所有候选项集的支持度,如果字典没有就追加元素,如果有就更新元素 supportData.update(supK) if len(Lk) == 0: break # Lk 表示满足频繁子项的集合,L 元素在增加,例如: # l=[[set(1), set(2), set(3)]] # l=[[set(1), set(2), set(3)], [set(1, 2), set(2, 3)]] L.append(Lk) k += 1 return L, supportData

我们写个测试以上代码

'''测试频繁项集生产''' def testApriori(): # 加载测试数据集 dataSet = loadDataSet() print ('dataSet: ', dataSet) # Apriori 算法生成频繁项集以及它们的支持度 L1, supportData1 = apriori(dataSet, minSupport=0.7) print ('L(0.7): ', L1) print ('supportData(0.7): ', supportData1) print ('->->->->->->->->->->->->->->->->->->->->->->->->->->->->') # Apriori 算法生成频繁项集以及它们的支持度 L2, supportData2 = apriori(dataSet, minSupport=0.5) print ('L(0.5): ', L2) print ('supportData(0.5): ', supportData2)

运行结果如下:

dataSet: [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] L(0.7): [[frozenset({3}), frozenset({2}), frozenset({5})], [frozenset({2, 5})]] supportData(0.7): {frozenset({5}): 0.75, frozenset({3}): 0.75, frozenset({3, 5}): 0.5, frozenset({4}): 0.25, frozenset({2, 3}): 0.5, frozenset({2, 5}): 0.75, frozenset({1}): 0.5, frozenset({2}): 0.75} ->->->->->->->->->->->->->->->->->->->->->->->->->->->-> L(0.5): [[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.5): {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}

到这一步,我们就找出我们所需要的 频繁项集 和他们的 支持度 了,接下来再找出关联规则即可!

第六步从频繁项集中挖掘关联规则

集合中的元素是不重复的,但我们想知道基于这些元素能否获得其它内容。 某个元素或某个元素集合可能会推导出另一个元素。 从先前 杂货店 的例子可以得到,如果有一个频繁项集 {豆奶,莴苣},那么就可能有一条关联规则 “豆奶 -> 莴苣”。 这意味着如果有人买了豆奶,那么在统计上他会购买莴苣的概率比较大。 但是,这一条件反过来并不总是成立。 也就是说 “豆奶 -> 莴苣” 统计上显著,那么 “莴苣 -> 豆奶” 也不一定成立。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyszpj.html