日常关联规则
关联规则 —— 基本设置
● 输入数据库:
■ 交易集合 ■ 交易 = 物品集合
● 输出:关联规则
■ 基于其他物品的出现来预测某些物品的出现的规则。
TID Items
1 item1, item2, item3, item4, item5
2 item2, item3, item5
3 item1, item4, item5
4 item2, item3, item5, item6, item7
5 item1, item3, item5, item7
前提 → 结果
-
关联规则 {item2, item3} → {item5}:
- TID 1: 包含 item2, item3, 和 item5。
- TID 2: 包含 item2, item3, 和 item5。
- TID 4: 包含 item2, item3, 和 item5。
在这三次交易中,每次 item2 和 item3 都出现时,item5 也都出现了。因此,这个关联规则在给定的数据集中是有效的。
-
关联规则 {item1} → {item3}:
- TID 1: 包含 item1 和 item3。
- TID 3: 只包含 item1,但不包含 item3。
- TID 5: 包含 item1 和 item3。
在这三次交易中,有两次 item1 出现时,item3 也出现了,但在 TID 3 中,item1 出现而 item3 没有出现。因此,这个关联规则在给定的数据集中不是100%准确的,但仍然有一定的关联度。
应用 —— 市场篮子分析
● 理解顾客的购物行为
■ 物品:超市/商店中的产品 ■ 交易:结账时的购物篮
● 有趣的规则:
■ 购买 {a, b} 的顾客也倾向于购买 {x, y} ■ 例子:{麦片}→{牛奶}
● 目的
■ 货架管理 / 商品摆放 ■ 促销(产品捆绑) ■ 推荐 ■ 定价策略
TID 物品
1 面包,酸奶
2 面包,牛奶,麦片,鸡蛋
3 酸奶,牛奶,麦片,奶酪
4 面包,酸奶,牛奶,麦片
5 面包,酸奶,牛奶,奶酪
应用 —— 医疗数据分析
● 诊断支持系统
■ 物品:症状、疾病 ■ 交易:患者的医疗史
● ADR 发现(不良药物反应)
■ 物品:药物、反应/症状 ■ 交易:患者的医疗史
应用 —— 人口普查数据分析
● 洞察人口情况
■ 物品:人口统计数据 ■ 交易:人口普查记录
● 有趣的规则:
■ 基于共同的人口统计特征对人群之间的相关性 ■ 例子:{大学毕业, ≥30}→{高收入}
● 目的
■ 政策与决策制定 ■ 资源分配 ■ 城市规划
应用 —— 行为数据分析
● 用户偏好与关联
■ 物品:电影、歌曲、书籍等。 ■ 交易:观看/听/读历史
● 有趣的规则(电影):
■ 观看了电影 {a, b} 的观众 也观看了电影 {x, y} ■ 例子:{大白鲨}→{它}
● 目的
■ 推荐系统
关联规则 —— 问题陈述
● 关联规则不是“硬性”规则
■ 例如,{麦片}→{牛奶} 并不意味着顾客 在购买麦片时总是购买牛奶
■ 每一种可能的组合(例如,{酸奶, 面包}→{牛奶}) 都是潜在的关联规则
● 给定独特的物品 ➜ 规则
■ ➜ 有602种可能的规则!
● 关联规则挖掘
■ 找到有趣/显著的关联规则
■ 高效地找到这样的规则
定义 — 项集(Itemset),K-项集(K-itemset)
● 项集(Itemset)
■ 一组物品的子集,例如:{面包}、{酸奶}、{面包, 酸奶}、{牛奶}、{麦片}、{鸡蛋}、{面包, 牛奶}、{面包, 牛奶, 麦片} 等。
● K-项集(K-itemset)
■ 包含k个物品的项集,例如,当k=3时:{面包, 牛奶, 麦片}、{面包, 酸奶, 奶酪}、{酸奶, 牛奶, 麦片}、{酸奶, 麦片, 奶酪}、{牛奶, 麦片, 奶酪}、{面包, 牛奶, 鸡蛋} 等。
定义 — 针对项集的支持计数、支持度
● 支持计数 SC (Support Count)
■ 包含某个项集的交易数量
■ 例如,SC({面包, 酸奶, 牛奶}) = 2,出现了两次。
● 支持度 S (Support)
■ 包含某个项集的交易的比例
■ 例如,S({面包, 酸奶, 牛奶}) = 2/5,在五个人中出现了两次。
TID 物品
1 面包,酸奶
2 面包,牛奶,麦片,鸡蛋
3 酸奶,牛奶,麦片,奶酪
4 面包,酸奶,牛奶,麦片
5 面包,酸奶,牛奶,奶酪
定义 — 频繁项集
● 频繁项集 (Frequent Itemset)
■ 支持度大于或等于最小阈值 的项集
■ 例如,如果 ,所有的频繁项集
k=1: 面包:4/5. 酸奶: 4/5. 牛奶: 3/5. 麦片: 3/5
k=2: 面包, 酸奶: 3/5. 酸奶, 牛奶: 3/5. 牛奶, 麦片: 3/5
定义 — 关联规则
● 关联规则 (Association Rule)
■ 蕴含表达式 X→Y, 其中 X 和 Y 是项集
■ 例如,{酸奶, 牛奶}→{面包}
定义 — 关联规则的支持度
● 关联规则的支持度
■ 包含关联规则 X→Y 中所有物品的交易的比例
是交易数量
■ 示例:
● 区别
- 项集的支持度:是数据集中包含该项集的交易的比例。例如,如果有100笔交易,其中10笔交易包含了项集 {面包, 牛奶},那么该项集的支持度是10/100 = 0.1或10%。
- 关联规则的支持度:是数据集中同时包含关联规则左侧和右侧的项集的交易的比例。例如,对于关联规则 {面包} → {牛奶},其支持度是同时包含面包和牛奶的交易的比例。
定义 — 置信度
● 关联规则 X→Y 的置信度 (Confidence)
■ 在给定 X 的情况下 Y 的概率
高支持度、高置信度 ➜ 有趣的规则
低支持度:(X∪Y) 中的物品不经常一起出现
高支持度:(X∪Y) 中的物品经常一起出现
低置信度:即使 X 中的物品一起出现,它们经常不与 Y 中的物品一起出现
高置信度:如果 X 中的物品一起出现,它们经常与 Y 中的物品一起出现
暴力法
暴力法 — 算法
● 给定一组交易, 找到所有满足以下条件的关联规则 X→Y:
■ 支持度 S(X→Y) ≥ minsup
■ 置信度 C(X→Y) ≥ minconf
● 暴力法算法:
■ 列出所有可能的关联规则 X→Y
■ 计算每个规则的支持度 S(X→Y) 和置信度 C(X→Y)
■ 剔除那些 S(X→Y) < minsup 和 C(X→Y) < minconf 的规则
暴力法 — 计算复杂度
● 给定独特的物品 ➜
规则
■ ➜ 理论上有602种可能的规则!
● 设 为数据库中一个交易内的物品的最大数量 ➜
规则
■ ➜ ≤ 250种“可用”的规则!
250和602之间的差异似乎微不足道,但这只是因为在这个简化示例中,d=6 和 w=4 的数量级是相同的。 数字250也忽略了重复的规则。
TID 物品
1 面包,酸奶
2 面包,牛奶,麦片,鸡蛋
3 酸奶,牛奶,麦片,奶酪
4 面包,酸奶,牛奶,麦片
5 面包,酸奶,牛奶,奶酪
N : TID的数量, 是独特物品的数量,真正不同规则的数量:154
解耦支持度和置信度
● 回顾
● 观察1
■ 只有当 X∪Y 是一个频繁项集时,规则 X→Y 才有足够的支持度
■ 当 X∪Y 不是频繁项集时,无需计算规则的置信度
关联规则挖掘的两部分算法
● 第一部分 — 频繁项集生成
■ 生成支持度 ≥ minsup 的项集
■ "仅"需要检查 (仍然不好)个可能的项集
● 第二部分 — 关联规则生成
■ 通过项集的二进制分区从频繁项集中生成规则
■ 返回置信度 ≥ minconf 的规则
生成顺序:数据集 -> 频繁项集 -> 关联规则
频繁项集生成
● 项集格子(或称为格结构)
■ 节点:项集
■ 边:包含关系
● 个节点/项集
■ 当 d=5 时 ➜ 有 31 个项集 (从{
}开始,但是总项集不包含空集)
{A} {B} {C} {D} {E} {A, B} {A, C} {A, D} {A, E} {B, C} {B, D} {B, E} {C, D} {C, E} {D, E}
{A, B, C} {A, B, D} {A, B, E} {A, C, D} {A, C, E} {A, D, E} {B, C, D} {B, C, E} {B, D, E} {C, D, E}
{A, B, C, D} {A, B, C, E} {A, B, D, E} {A, C, D, E} {B, C, D, E} {A, B, C, D, E}
其中 {A, B, C, D} 包含 {A, B, C}
频繁项集生成 — 暴力算法
为所有找到的项集设置全局计数器
对于每个交易,生成 k-项集,其中 k = 1, 2, 3, … (直到交易中的物品数量)
对于 k-项集,其全局计数器增加1
问题:如果一个关联规则至少需要2个物品,那么我们为什么需要计算1-项集?
答案:用于计算置信度
频繁项集生成 — 暴力算法
● 复杂度分析
APRIORI (关联规则挖掘算法)
Apriori原理(也称为反单调性原理)
● 观察2:如果 X 和 Y 是项集且 X⊆Y,那么
■ S(X) ≥ S(Y)
■ 如果 Y 是频繁的,那么 X 也是频繁的
■ 如果 X 不是频繁的,那么 Y 也不是频繁的
■ 示例:X= S({面包, 酸奶}) = 3/5 ; Y= S({面包, 酸奶, 牛奶}) = 2/5
■ 如果一个项集(例如,{B,C,D,E})是频繁的,那么它的任何子集(例如,{B,D,E}、{C,E})也必定是频繁的。这是因为子集的支持度总是大于或等于超集的支持度。换句话说,任何包含{B,C,D,E}的交易也必定包含{B,D,E}和{C,E}。
■ 如果一个项集(例如,{A,B})不是频繁的,那么它的任何超集(例如,{A,B,D}、{A,B,C,D})也必定不是频繁的。这是因为超集的支持度总是小于或等于子集的支持度。换句话说,任何包含{A,B,D}或{A,B,C,D}的交易也必定包含{A,B}。
Apriori算法
● 符号说明
■ — 候选的k-项集
■ — 频繁的k-项集 (
)
对于 k 从 1 到 w:这是一个循环,从1开始,每次增加1,直到达到最大的项集大小w。在每一步,我们都会尝试找到大小为k的频繁项集。
■ 生成:从 生成
:在这一步,我们使用已知的频繁的(k-1)-项集(
)来生成候选的k-项集(
)。这通常是通过组合
中的项集来完成的。
■ 剪枝:使用 从
中剪枝 k-项集:这是Apriori原理的应用。我们知道,如果一个(k-1)-项集不是频繁的,那么它的超集也不可能是频繁的。因此,我们可以使用
来检查
中的项集,如果一个k-项集的任何子集不在
中,那么这个k-项集可以被剪枝。
■ 计算:计算剩余 项集的支持计数(SC):对于剩下的候选项集,我们计算它们在数据集中的支持计数,即包含这些项集的交易数量。
■ 过滤:过滤支持计数不足的 项集 ➜
:在这一步,我们根据最小支持度阈值过滤掉支持计数不足的项集。剩下的项集构成了频繁的k-项集
。
■ 停止:如果 || = 0, 停止:如果在某一步我们没有找到任何新的频繁项集,那么我们可以停止算法,因为更大的项集也不可能是频繁的。
● 示例:
minsup =0.4 ➜ 最小支持数为2
➜
生成:物品集:{面包}, {麦片}, {奶酪} , {鸡蛋} , {牛奶}, {酸奶}
计算:物品集:{面包} - 4, {麦片} - 3, {奶酪} - 2 , {鸡蛋} - 1 , {牛奶} - 4, {酸奶} - 4
过滤:物品集:{面包} - 4, {麦片} - 3, {奶酪} - 2 , {鸡蛋} - 1 , {牛奶} - 4, {酸奶} - 4
物品集:{面包} - 4, {麦片} - 3, {奶酪} - 2 , {牛奶} - 4, {酸奶} - 4
➜
生成:物品集:{面包, 麦片}, {面包, 奶酪}, {面包, 牛奶}, {面包, 酸奶}, {麦片, 奶酪}, {麦片, 牛奶}, {麦片, 酸奶}, {奶酪, 牛奶}, {奶酪, 酸奶}, {牛奶, 酸奶}
计算:物品集:{面包, 麦片}- 2, {面包, 奶酪}- 1, {面包, 牛奶}- 3, {面包, 酸奶}- 3, {麦片, 奶酪}- 1, {麦片, 牛奶}- 3, {麦片, 酸奶}- 2, {奶酪, 牛奶}- 2, {奶酪, 酸奶}- 2, {牛奶, 酸奶}- 3
过滤:物品集:{面包, 麦片}- 2, {面包, 奶酪}- 1, {面包, 牛奶}- 3, {面包, 酸奶}- 3, {麦片, 奶酪}- 1, {麦片, 牛奶}- 3, {麦片, 酸奶}- 2, {奶酪, 牛奶}- 2, {奶酪, 酸奶}- 2, {牛奶, 酸奶}- 3
➜
物品集:{面包, 麦片}- 2, {面包, 牛奶}- 3, {面包, 酸奶}- 3, {麦片, 牛奶}- 3, {麦片, 酸奶}- 2, {奶酪, 牛奶}- 2, {奶酪, 酸奶}- 2, {牛奶, 酸奶}- 3
➜
生成:物品集:{面包, 麦片, 牛奶}, {面包, 麦片, 酸奶}, {面包, 牛奶, 酸奶},{麦片, 牛奶, 酸奶},{奶酪, 牛奶,酸奶}
计算:物品集:{面包, 麦片, 牛奶}- 2, {面包, 麦片, 酸奶}- 1, {面包, 牛奶, 酸奶}- 2,{麦片, 牛奶, 酸奶}- 2,{奶酪, 牛奶,酸奶}- 2
过滤:物品集:{面包, 麦片, 牛奶}- 2, {面包, 麦片, 酸奶}- 1, {面包, 牛奶, 酸奶}- 2,{麦片, 牛奶, 酸奶}- 2,{奶酪, 牛奶,酸奶}- 2
➜
物品集:空
完成!!!
● 输出:所有的频繁项集
■ i ≥ 2 — 不能从单一物品中创建规则。
■ — 项集的集合不为空。
● 实现细节:
■ 生成/剪枝 — 如何从 得到
?
■ 计算 — 如何高效地为 项集计算支持计数(SC)? (这里没有涉及,因为这是在实现层面完成的)
生成/剪枝:
方法
(频繁的1-项集):物品集:{面包} , {麦片} , {奶酪} , {牛奶} , {酸奶}
(频繁的2-项集):物品集:{面包, 麦片}, {面包, 牛奶}, {面包, 酸奶}, {麦片, 牛奶}, {麦片, 酸奶}, {奶酪, 牛奶}, {奶酪, 酸奶}, {牛奶, 酸奶}
生成: 合并频繁的 (k−1)-项集和频繁的1-项集,以获得所有可能的 k-项集。
生成: 合并在 (k−2) 项中有重叠的频繁的 (k−1)-项集,以获得所有可能的 k 项集。
(3-项集)物品集:{面包, 麦片, 奶酪} {面包, 麦片, 牛奶} {面包, 麦片, 酸奶} {面包, 奶酪, 牛奶} {面包, 奶酪, 酸奶} {面包, 牛奶, 酸奶} {麦片, 奶酪, 牛奶} {麦片, 奶酪, 酸奶} {麦片, 牛奶, 酸奶} {奶酪, 酸奶, 牛奶}
剪枝: 删除所有包含至少一个不在 中的 (k−1)-项集的 k-项集。
(3-项集)剪枝后的物品集:{面包, 麦片, 牛奶}, {面包, 麦片, 酸奶}, {面包, 牛奶, 酸奶},{麦片, 牛奶, 酸奶},{奶酪, 牛奶,酸奶}
计算支持计数:最小值
● 为 中的每个候选项集计算支持计数 (SC)。
■ 需要完全扫描数据库。
■ 对于每个交易 T,检查每个项集 s 是否属于 T。
■ 如果 s 属于 T,则更新 s 的计数器。
关于挖掘关联规则的两部分算法:
● 第1部分 — 频繁项集生成(以上完成第一部分)
■ 生成支持度 ≥ minsup 的项集
■ Apriori算法
● 第2部分 — 关联规则生成
■ 通过项集的二进制划分从频繁项集中生成规则
■ 返回置信度 ≥ minconf 的规则
规则生成:
● 对于每个频繁项集 S, 派生候选规则 X→Y
■ 一个规则是 s 的二进制分割,即 Y=S−X
对于每个频繁项集,可能有 个规则。
解释: 考虑一个频繁项集 S。对于这个项集,我们可以为其生成的规则是所有可能的子集与其补集之间的关联。例如,如果 S={A,B,C},那么一个可能的规则是 A,B→C,其中 A,B 是子集,而 C 是其补集。(A→B, C), (B→A, C).....
但是,我们不能有空集到某个项集的规则,也不能有某个项集到空集的规则。因此,我们需要从所有可能的规则中减去这两种情况。
● 对于每个规则 X→Y
■ 计算置信度 C(X→Y)
■ 如果置信度 ≥ minconf, 将规则添加到最终结果集中。
两个值在频繁项集生成过程中已经被计算过了! ➜ 无需访问数据库 ➜ 快速
Apriori原则 (反单调性原则):
● 给定项集 S 和两个派生规则 和
,满足
=
= S。
;
● 例子:如果 {A,B,C}→{D} 的置信度很低,那么以下规则也会有低置信度:
■ {A}→{B,C,D} , {B}→{A,C,D} , {C}→{A,B,D} , {A,B}→{C,D} , {A,C}→{B,D} , {B,C}→{A,D}
● 规则格
■ 节点:关联规则
■ 边:包含关系,关于前提/后果
解释: 规则格是一个表示所有可能关联规则及其关系的结构。在这个格中,每个节点代表一个关联规则,而边表示一个规则是另一个规则的子集。
● 规则
■ 当 ∣S∣=4 ➜ 有14条规则。
如果规则 BCD→A 的置信度不足, 那么所有在后件中包含A的规则的置信度也都不足。
关于单一项集 S 的规则生成算法:
定义 — 提升度(Lift)
● 关联规则 X→Y 的提升度
■ 在控制了Y的支持度(即Y的受欢迎程度)的情况下,给定X时Y的概率。
TID 物品
1 面包,酸奶
2 面包,牛奶,麦片,鸡蛋
3 酸奶,牛奶,麦片,奶酪
4 面包,酸奶,牛奶,麦片
5 面包,酸奶,牛奶,奶酪
S(X) = 麦片=3/5=0.6 , S(Y) = 面包 =4/5=0.8, S(X->Y) =2/5=0.4
■ 面包的概率
S(Y) = 面包 =4/5=0.8
■ 计算给定{麦片}时{面包}的概率
P= 同时包含面包和麦片的交易数/包含麦片的交易数=
■ 当交易中有麦片时,面包出现的概率实际上是降低的。
L( {麦片} —> {面包} ) 1.0
● 关于关联规则的提升度(Lift)及其他度量的使用:
■ 进一步筛选和排名关联规则
■ 寻找“替代”物品。
注意:提升度并不是Apriori算法的一部分,因为这里的反单调性原则不适用。
总结
● 有趣的模式:关联规则 X→Y
■ 基于其他物品X的出现来预测某些物品Y的出现
■ 适用于事务数据的更广泛的任务
■ 定义规则是否有用的各种度量(例如,支持度、置信度、提升度)
● 处理复杂性的实用算法
■ 分离支持度和置信度的计算
■ Apriori算法用于频繁项集生成和关联规则生成