1 相关概念
交易号码 | 商品 |
1 | 豆奶,莴苣 |
2 | 莴苣,尿布,葡萄酒,甜菜 |
3 | 豆奶,尿布,葡萄酒,橙汁 |
4 | 莴苣,豆奶,尿布,葡萄酒 |
5 | 莴苣,豆奶,尿布,橙汁 |
频繁项集: 经常出现在一块的物品的集合,是指那些经常出现在一起的物品,例如的{葡萄酒、尿布、豆奶},从上面的数据集中也可以找到尿布->葡萄酒的关联规则,这意味着有人买了尿布,那很有可能他也会购买葡萄酒。
关联规则: 暗示两种物品之间可能存在很强的关系
支持度: 一个项集的支持度被定义为数据集中包含该项集的记录所占的比例,上图中,豆奶的支持度为4/5,(豆奶、尿布)为3/5。支持度是针对项集来说的,因此可以定义一个最小支持度,只保留最小支持度的项集。
支持度 = (包含物品A的记录数量) / (总的记录数量)
置信度: 针对如{尿布}->{葡萄酒}这样的关联规则来定义的。计算为 支持度{尿布,葡萄酒}/支持度{尿布},其中{尿布,葡萄酒}的支持度为3/5,{尿布}的支持度为4/5,所以“尿布->葡萄酒”的可行度为3/4=0.75,这意味着尿布的记录中,我们的规则有75%都适用。
置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)
2 算法思想和步骤
(1)算法思想
如果某个项集是频繁项集,那么它所有的子集也是频繁的,即如果 {0,1} 是频繁的,那么 {0}, {1} 也一定是频繁的。反之。
在图中,已知阴影项集{2,3}是非频繁的。利用这个知识,我们就知道项集{0,2,3},{1,2,3}以及{0,1,2,3}也是非频繁的。也就是说,一旦计算出了{2,3}的支持度,知道它是非频繁的后,就可以紧接着排除{0,2,3}、{1,2,3}和{0,1,2,3}。
(2)算法步骤
提供两个参数,数据集和最小支持度。
先遍历1个物品组合的情况,剔除掉支持度低于最小支持度的数据项,然后用剩下的物品进行组合。遍历2个物品组合的情况,再剔除不满足条件的组合。不断递归下去,直到不再有物品可以组合。
3 Python案例解析
def apriori(df, min_support=0.5, use_colnames=False, max_len=None)
参数如下:
- df:数据集。
- min_support:给定的最小支持度。
- use_colnames:默认False,则返回的物品组合用编号显示,为True的话直接显示物品名称。
- max_len:最大物品组合数,默认是None,不做限制。如果只需要计算两个物品组合的话,便将这个值设置为2。
import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori #设置数据集 dataset = [['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'], ['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'], ['牛奶','苹果','芸豆','鸡蛋'], ['牛奶','独角兽','玉米','芸豆','酸奶'], ['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']] te = TransactionEncoder() #one-hot 编码 te_ary = te.fit(records).transform(records) df = pd.DataFrame(te_ary, columns=te.columns_) #利用 Apriori 找出频繁项集 freq = apriori(df, min_support=0.05, use_colnames=True)
我们设定的最小支持度是0.6,那么只有支持度大于0.6的物品集合才是频繁项集,最终结果如下:
support itemsets
0.6 (洋葱)
0.6 (牛奶)
1.0 (芸豆)
0.6 (酸奶)
0.8 (鸡蛋)
0.6 (芸豆, 洋葱)
0.6 (洋葱, 鸡蛋)
0.6 (牛奶, 芸豆)
0.6 (酸奶, 芸豆)
0.8 (芸豆, 鸡蛋)
0.6 (芸豆, 洋葱, 鸡蛋)