关联规则挖掘的目的是挖掘不同物品(item)之前的相关性,啤酒和尿布的故事就是一个典型的成功例子。关联规则挖掘思想简单高效,在广告推荐领域也有较多的应用,主要用于推荐模型落地前的流量探索以及构建规则引擎探寻高价值流量等。本文主要介绍关联规则挖掘常用的两种算法,即Aprior算法和Fpgrowth算法。
正式开始介绍这两种算法前,先简单讲述一下关联规则挖掘常用的几个概念。
a: 几个重要的概念
- 支持度: 某个物品组合出现的次数与总次数的比例;
- 置信度: 表示A物品出现时,会有多大的概率出现B,假如物品A出现了Na次,AB同时出现了Nab次,那么置信度(A–>B)=Nab/Na
- 提升度: 物品A出现对物品B出现概率的提升程度,也就是B在A集合中出现的概率与B在整体集合出现概率的比值,提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)。
a. 提升度 (A→B)>1:代表有提升; 正向规则
b. 提升度 (A→B)=1:代表有没有提升,也没有下降; 无效规则
c. 提升度 (A→B)<1:代表有下降; 负向规则
Apriori算法
Apriori算法的原理一言以蔽之,就是不断查找频繁项集的过程,而频繁项集就是我们需要界定的参数,我们界定一个支持度阈值S,当该物品组合的出现频率高于S时,我们认为该物品组合为频繁项集,对小于S的物品组合算法会忽略。
搞清楚频繁项集的含义之后,Apriori算法的实现原理就非常简单了,这里在介绍一个补充概念,规则包括的物品数量n,大致如下:
- 当n=1时,计算每一个物品的支持度Si1,保留Si1>S的物品集合F1;
- 当n=2时,将F1中的物品两两组合,计算每个组合的支持度Si2,保留Si2>S的物品集合F2;
- 当n=3时,将F2中的物品两两组合(组合后去重),仅保留长度为3的组合,计算每个组合的支持度Si3,保留Si3>S的物品集合F3;
- …以此类推,直到Fn集合为空;
如果某个物品的支持度不满足阈值,那么其任一两两组合也必不能满足条件;同理,如果某两两组合的支持度不满足阈值,那么其构成的任一三物品组合也必不能满足条件。这就是可以将每一次计算的结果建立在上一次结果的基础上的原因,大大减少计算量。
Apriori算法的python包很多,这里不给源码了,调用代码如下:
from efficient_apriori import apriori
data = [
('牛奶', '面包'),
('牛奶', '面包', '火腿'),
('面包', '火腿', '可乐'),
('火腿', '可乐', '方便面'),
('面包', '火腿', '可乐', '方便面')
]
itemsets, rules = apriori(data, min_support=0.6, min_confidence=0.3, verbosity=0)
print(itemsets, rules)
- 该包的调用结果不显示支持度的信息,需要修改源码,这里省略该过程。
- 程序运行结果如下:
({
1: {
('面包',): 4, ('火腿',): 4, ('可乐',): 3},
2: {
('可乐', '火腿'): 3, ('火腿', '面包'): 3}},
[{
火腿} -> {
可乐} (conf: 0.750, supp: 0.600, lift: 1.250, conv: 1.600),
{
可乐} -> {
火腿} (conf: 1.000, supp: 0.600, lift: 1.250, conv: 200000000.000),
{
面包} -> {
火腿} (conf: 0.750, supp: 0.600, lift: 0.938, conv: 0.800),
{
火腿} -> {
面包} (conf: 0.750, supp: 0.600, lift: 0.938, conv: 0.800)])
- conf: 置信度,supp: 支持度,lift: 提升度。
- conv(A—>B)表示,B物品在总集合中不出现的概率与B物品在A存在集合中不出现概率的比值。
Fp-growth算法
Fp-growth算法是Apriori算法的改进版本,本质上没啥区别。Fp-growth算法的原理很简单,该算法使用了一种称为频繁模式树的数据结构。FP-tree是一种特殊的前缀树,由频繁项头表和项前缀树构成,大致过程如下:
- 扫描数据库一遍.得到频繁项的集合F和每个频繁项的支持度.把F按支持度递降排序,结果记为L(A-val=6、B-val=5、C-val=4、D-val=4)(有序的F1).
- 创建FP-tree的根节点,记为T,并且标记为’root’,然后L的每项做如下的步骤:
a. 根据L中的顺序,将A作为第一个节点,在数据库中扫描,如果出现AB,那么从A延伸出一个节点B,B对应的val+1(val初始为0),如果出现AC,那么从A延伸出一个节点C,C对应的val+1;
b. 从A节点的子节点B出发,假如出现ABC,从那么从B延伸出一个节点C,C对应的val+1;
c. …以此类推,直到该路径对应子节点不在满足条件(支持度阈值);
Fp-growth算法的原理相对比较复杂,开源的python包比较少,这里附上对应的源码:
# -*- coding: utf-8 -*-
from tqdm import tqdm
import time
import psutil
import os
def load_data(): # 根据路径加载数据集
ans = [] # 将数据保存到该数组
reader = [
('牛奶', '面包'),
('牛奶', '面包', '火腿'),
('面包', '火腿', '可乐'),
('火腿',

本文介绍了关联规则挖掘的基本概念,如支持度、置信度和提升度,并详细讲解了Apriori和Fp-growth两种算法的工作原理及Python实现。Apriori算法通过不断查找频繁项集来挖掘规则,而Fp-growth算法利用频繁模式树(FP-tree)提高效率。两者都在广告推荐等领域有应用。

7562

被折叠的 条评论
为什么被折叠?



