本周复现了《机器学习实战》第11章Apriori关联分析和第12章FP-growth。两个算法都在寻找频繁项集,但路线不同:Apriori不断产生并检查候选组合,FP-growth先把数据压缩成一棵树,再从树中递归挖掘。

这篇复盘主要记录

  • 支持度、置信度和频繁项集分别是什么
  • Apriori为什么能减少不必要的候选组合
  • FP树如何压缩重复的交易前缀
  • 两种算法有什么联系和区别

一、关联分析在找什么

超市里有很多购物篮记录。关联分析想回答的不是“这位顾客属于哪一类”,而是“哪些商品经常一起出现”。例如,若买面包的人经常也买牛奶,就可以形成一条规则:

{面包} → {牛奶}

但“出现过”远远不够。组合必须出现得足够频繁,规则也必须足够可靠,这就需要支持度和置信度。

二、支持度与置信度

支持度表示某个项集在全部交易中出现的比例:

support(X) = 包含X的交易数 / 全部交易数

置信度表示在已经出现X的交易中,同时出现Y的比例:

confidence(X→Y) = support(X∪Y) / support(X)

生活化地说,支持度回答“这组搭配常不常见”,置信度回答“买了前面的东西后,后面的东西有多大概率也出现”。两者不是一回事。

三、Apriori最重要的先验性质

如果一个项集是频繁的,那么它的所有子集也一定频繁;反过来,只要某个子集不频繁,包含它的更大项集就不可能频繁。

假设“面包和牛奶”都很少一起出现,那么“面包、牛奶和鸡蛋”只会更少,不必再扫描数据验证。Apriori就是利用这一点,按层次生成候选项集:

候选1项集 → 频繁1项集
频繁1项集 → 候选2项集 → 频繁2项集
频繁2项集 → 候选3项集 → 频繁3项集

四、书中数据的真实结果

书中的交易记录为:

[[1, 3, 4],
 [2, 3, 5],
 [1, 2, 3, 5],
 [2, 5]]

设置最低支持度为0.5后,共留下9个频繁项集:4个频繁1项集、4个频繁2项集和1个频繁3项集。其中{2,5}支持度为0.75,{2,3,5}支持度为0.5。

书中Apriori示例的频繁项集支持度柱状图
图1:虚线是最低支持度0.5。不同颜色区分1项集、2项集和3项集。

五、从频繁项集生成关联规则

频繁项集只说明组合常见,还没有方向。对于{2,5},可以尝试两条规则:{2}→{5}和{5}→{2}。本次最低置信度设置为0.7,得到3条规则:

{1} → {3},置信度 1.000
{5} → {2},置信度 1.000
{2} → {5},置信度 1.000

置信度为1只表示这4条示例交易中没有反例。样本很少,所以不能把它直接解释成现实世界里100%成立。

六、Apriori为什么可能很慢

商品种类增加后,可能组合的数量增长得非常快。Apriori每生成一层候选项集,都要再次扫描数据统计支持度。先验性质已经过滤了很多组合,但数据量和项目数很大时,候选集仍可能很多。

七、FP-growth怎样减少重复扫描

FP-growth不再逐层产生大量候选项集,而是先统计频率、去掉不频繁项,再把每条交易按全局频率排序并插入FP树。不同交易相同的开头会共享树节点,因此可以压缩数据。

FP树节点保存:

头指针表则把相同项目的节点串起来,方便快速找到它在树中的所有位置。

八、条件模式基和条件FP树

挖掘某个项目时,要从它的每个节点向上回溯到根节点。得到的前缀路径及计数组成条件模式基。再用条件模式基创建一棵更小的条件FP树,递归寻找与该项目共同出现的频繁组合。

可以把它类比成:先锁定“买了牛奶”的购物篮,只保留牛奶之前的有效商品,再在这个缩小后的世界中继续寻找规律。

九、两种算法怎样比较

方面AprioriFP-growth
共同目标寻找频繁项集寻找频繁项集
主要方法逐层生成候选项集构建FP树并递归挖掘
优点过程直观,容易理解避免产生大量候选集
难点候选组合可能爆炸树和递归过程较难理解

FP-growth不是用来直接生成关联规则的新指标,它首先更高效地寻找频繁项集。得到频繁项集后,仍可以按支持度和置信度生成规则。

十、与书上源码不同的地方

十一、目前还不熟的地方

  1. 候选集连接。低阶项集能跟下来,高阶项集的连接、去重和剪枝仍容易混乱。
  2. 规则是否有价值。支持度和置信度达到阈值,不代表现实中一定有因果关系。
  3. 条件FP树。能跟着代码运行,但节点链接、前缀路径和递归返回仍需要手画一遍。

十二、下周计划

  1. 01
    配置PyTorch环境

    检查PyTorch版本、CPU和GPU状态。

  2. 02
    学习张量操作

    完成创建、变形、广播、索引和数据预处理。

  3. 03
    复习线性代数

    区分按元素乘法、点积和矩阵乘法。

  4. 04
    学习自动求导

    理解计算图、backward、梯度累积和detach。

十三、第九周最值得保留的认识

频繁项集支持度置信度先验性质FP树

Apriori利用先验性质逐层筛选频繁项集,再用支持度判断组合是否常见、用置信度评价规则;FP-growth则使用FP树压缩重复路径,减少候选项集带来的开销。

这一周最重要的变化,是开始从“预测一个结果”转向“发现数据中共同出现的模式”。