Apriori算法寻找频繁项集

    技术2022-07-11  92

    前言

    前两天期末考试完,歇息了一天,巴适 ~ ,感觉脑子有点生锈了,趁有空,操作一下数据挖掘中的Apriori算法。

    介绍

    Apriori算法是一种挖掘频繁项集的方法,它是基于先验性质,使用逐层搜索的迭代方法,利用k项集探索k+1项集。它是用来寻找具有相关性符合条件的项集,例如尿布和啤酒的故事,看似两者毫不相干,但是它们却频频地同时被顾客买走。我们的目的就是寻找这些具有相关性的数据。

    算法原理

    在说原理之前,先回顾一下两个概念:支持度support和置信度confidence。

    支持度support。数据集中包含该项集的数据所占数据集的比例,是用来度量一个集合在原始数据中出现的频率。例如在拥有5条记录的数据集中,其中集合{a,b}一起出现了3次,那么集合{a,b}的支持度就是3/5=60%。置信度confidence。是针对一条关联规则来定义的,a->b的置信度=支持度{a|b}/支持度{a}。举个例子:例如尿布和啤酒就可以定义为“支持度({尿布, 啤酒})/支持度({尿布})”。 假设{尿布, 啤酒}的支持度为3/5,尿布的支持度为4/5,则“尿布 ➞ 啤酒”的置信度为3/4=0.75。简单来说,就是用户购买尿布的事件中包含“购买尿布和啤酒”的比率。这意味着对于包含“尿布”的所有记录,我们的规则对其中75%的记录都适用。 支持度公式:support(A→B)=P(A∪B) 置信度公式:confidence(A→B)=P(B|A)=support(A∪B)/support(A)

    在庞大的数据集中,如果用枚举的方法寻找频繁项集,那么工程量将是浩大的,而在Apriori算法定律中引出了两个定义:①如果一个集合是频繁项集,则它的所有子集都是频繁项集②如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。例如在集合{c,m,b}中,如果集合{c,m,b}是频繁项集那么{c,b}、{m,b}等等它的子集就都是频繁项集,反观,如果{c,m,b}不是频繁项集,那么像{c,a,m,b}或者是{c,m,b,d,w}诸如此类的超集也都不是频繁项集。这样一来在计算的过程中就大大消除了完全不可能是频繁项集的集合,减少了工作量。 算法的计算过程是:首先,通过扫描数据库,累计每个项的个数,收集满足最小支持度的项,找出频繁1项集的集合,记为集合L1;然后,使用L1找出频繁2项集的集合L2,使用L2找出L3,如此反复迭代,直到不能再找到频繁k项集。具体过程如下:

    算法实现

    问题:假设min_sup=50%,min_conf=50%,根据以下数据集,完成数据集关联规则的挖掘。

    解答:

    综上:挖掘出的频繁项集是{c,m}、{c,b}、{m,b}、{b,d}、{c,m,b}。 然后计算关联规则,以频繁项集{c,m,b}为例: {c,m}→b,confidence=support(c,m,b) / support(c,m)=0.5/0.75=2/3 {c,b}→m,confidence=2/2=1 {m,b}→c,confidence=2/2=1 c→{m,b},confidence=2/3 m→{c,b},confidence=2/3 b→{c,m},confidence=2/3

    Processed: 0.010, SQL: 9