Apriori Algorithm - 先验算法,基于数据挖掘和关联规则的推荐算法(二)
前言:上一章介绍了Apriori算法的核心概念、数据频繁项集、以及算法的核心公式。接下来将通过一个例子,手工演算Apriori算法
Apriori实例
在一家烧烤店,有6名客人,分别购买了以下商品,计算商品之间的关联性
tips: 数据的N项集,以下简称K = N
客人 | 购买的产品 |
---|---|
老李 | 鸡翅,玉米,羊肉串,韭菜,鸡杂,啤酒 |
老王 | 鸡翅,韭菜,鸡杂,柠檬茶 |
张三 | 羊肉串,韭菜 |
徐义杰 | 玉米,鸡杂,柠檬茶,啤酒 |
刘淇昌 | 鸡翅,韭菜,羊肉串,鸡杂,柠檬茶 |
徐家丽 | 鸡翅,韭菜,玉米柠檬茶 |
step1: 定义2个关键值(minSup、minConf)
minSup = 0.5 = 50% minConf = 0.7 = 70%
step2: 计算数据K=1项集Sup
L1 | C1 | Sup1 |
---|---|---|
鸡翅 | 4 | 2/3 -> 0.667 |
玉米 | 3 | 1/2 -> 0.5 |
羊肉串 | 3 | 1/2 -> 0.5 |
韭菜 | 4 | 2/3 -> 0.667 |
鸡杂 | 4 | 2/3 -> 0.667 |
啤酒(此Sup < minSup,不再参与后续聚合) | 2 | 1/3 -> 0.334 |
柠檬茶 | 4 | 2/3 -> 0.667 |
根据第一章的Sup计算公式可得出所有商品的K=1项集Sup
例:Sup{鸡翅} = 鸡翅出现的次数(4次) / 总数据项数量(6条) = 4 / 6 = 2/3 = 0.667 (之后的Sup计算不再举例说明)
step3: 计算数据K=2项集Sup
同理,Sup < minSup的数据集不再记录在表格中
L2 | C2 | Sup2 |
---|---|---|
{鸡翅,韭菜} | 4 | 2/3 → 0.667 |
{鸡翅,鸡杂} | 3 | 1/2 → 0.5 |
{鸡翅,柠檬茶} | 3 | 1/2 → 0.5 |
{羊肉串,韭菜} | 3 | 1/2 → 0.5 |
{韭菜,鸡杂} | 3 | 1/2 → 0.5 |
{韭菜,柠檬茶} | 3 | 1/2 → 0.5 |
step4: 计算数据K=3项集Sup
L3 | C3 | Sup3 |
---|---|---|
{鸡翅,韭菜,鸡杂} | 3 | 1/2 → 0.5 |
{鸡翅,韭菜,柠檬茶} | 3 | 1/2 → 0.5 |
至此,所有数据集的Sup计算完毕!
step5: 计算全部Sup对应的Conf
Conf({鸡翅,韭菜} -> {鸡杂}) = {鸡翅,韭菜,鸡杂} / {鸡翅,韭菜} = C3 / C2 = 3 / 4 = 0.75
Conf({鸡翅,鸡杂} → {韭菜})= {鸡翅,鸡杂,韭菜} / {鸡翅,鸡杂} = C3 / C2 = 3/3 = 1
Conf({鸡翅,韭菜} → {柠檬茶})= {鸡翅,韭菜,柠檬茶} / {鸡翅,韭菜} = C3 / C2 = 3/4 = 0.75
以上为K=3的Conf计算
Conf({柠檬茶,韭菜} → {鸡翅})= {鸡翅,韭菜,柠檬茶} / {柠檬茶,韭菜} = C3 / C2 = 3/3 = 1
Conf{鸡翅} → {韭菜} = {鸡翅,韭菜} / {鸡翅} = C2 / C1 = 4/4 = 1
Conf{鸡杂} → {鸡翅} = {鸡翅,鸡杂} / {鸡杂} = C2 / C1 = 3/4 = 0.75
Conf{鸡翅} → {柠檬茶} = {鸡翅,柠檬茶} / {鸡翅} = C2 / C1 = 3/4 = 0.75
Conf{羊肉串} → {韭菜} = {羊肉串,韭菜} / {羊肉串} = C2 / C1 = 3/3 = 1
Conf{韭菜} → {羊肉串} = {羊肉串,韭菜} / {韭菜} = C2 / C1 = 3/4 = 0.75
Conf{韭菜} → {鸡杂} = {韭菜,鸡杂} / {韭菜} = C2 / C1 = 3/4 = 0.75
Conf{韭菜} → {柠檬茶} = {韭菜,柠檬茶} / {韭菜} = C2 / C1 = 3/4 = 0.75
以上为K=3的Conf计算
至此,所有数据集的Conf值计算完毕!
*这里可能会有疑问,为什么没有K=1的Conf值?第一章里关于Conf的介绍讲到,Conf值是“信心值”。而K=1项集时,数据没有关联性,所以不存在Conf值,Conf值的计算最早只有在K=2时才开始
step6: 计算Lift
Lift({鸡翅,韭菜} → {鸡杂}) = Sup{鸡翅,韭菜,鸡杂} / Sup{鸡翅,韭菜} * Sup{鸡杂} = 0.5 / 2/3 * 2/3 = 0.5 / 0.44 = 1.136
Lift({鸡翅,鸡杂} → {韭菜}) = Sup{鸡翅,韭菜,鸡杂} / Sup{鸡翅,鸡杂} * Sup{韭菜} = 0.5 / 0.5 * 0.667 = 1.497
Lift({鸡翅,韭菜} → {柠檬茶}) = Sup{鸡翅,韭菜,柠檬茶} / Sup{鸡翅,韭菜} * Sup{柠檬茶} = 0.5 / 0.667 * 0.667 = 1.124
Lift({柠檬茶,韭菜} → {鸡翅}) = Sup{鸡翅,韭菜,柠檬茶} / Sup{柠檬茶,韭菜} * Sup{鸡翅} = 0.5 / 0.5 * 0.667 = 1.497
以上为三阶Lift计算,即:购买产品A和B是否会对C有影响。
以此类推,可继续计算二阶Lift的所有结果,以得出产品A对B是否有购买影响。
由于Lift为【提升度】通过所有Lift的计算,对Lift < 1的结果,以及对应的Sup,Conf作废弃处理,即:此Sup和Conf均不具备参考性
篇幅受限,K=2的Lift值将不计算,读者可以自己动手试试
通过以上演算,我们可以得出以下结论:
结论1: 购买鸡翅,韭菜的客人大概率会买鸡杂
结论2: 购买鸡翅,鸡杂的客人有较高的概率会买韭菜
结论3: 购买鸡翅,韭菜的客人有大概率会买柠檬茶
结论4: 购买柠檬茶,韭菜的客人有较高概率会买鸡翅
请记住:Sup、Conf、Lift都不能单独采信,若要算法做出精准决策时,需要3个关键值均达到要求。且不同场景下,3个关键值大小的设置,会极大程度上影响算法做出的决策!
至此,我们已经通过一个简单的小例子,展示了Apriori算法的能力。下一章我们将把本章的算法思想通过代码实现!