关联规则挖掘
由 Agrawal 等人于 1993 年提出
在数据库和数据挖掘领域已有深入研究的重要的数据挖掘模型.
假设所有数据是分类型的.
对于数值型数据没有好算法.
开始时用于购物篮分析, 寻找顾客购买项之间的关系.
模型: 数据
I = {i1, i2, …, im}: 所有项的集合。
事务 t :
t 是一个项集, 且 t I。
事务数据库 T: 事务的集合 T = {t1, t2, …, tn}。
事务数据: 超市数据
购物篮事务:
t1: {面包, 芝士, 牛奶}
t2: {苹果, 鸡蛋, 盐, 酸乳}
… …
tn: {饼干, 鸡蛋, 牛奶}
概念:
一个项: 购物篮中的一个商品
I: 超市销售的所有商品的集合
一个事务: 一个购物篮中购买的商品; 可能带TID (事务ID)
一个事务数据库: 事务的一个集合
事务数据: 文档集合
一个文档数据集.每个文档看作一个关键字袋子(bag of keywords)
doc1: Student, Teach, School
doc2: Student, School
doc3: Teach, School, City, Game
doc4: Baseball, Basketball
doc5: Basketball, Player, Spectator
doc6: Baseball, Coach, Game, Team
doc7: Basketball, Team, City, Game
模型: 规则
如果 X t, 我们称事务 t 包含 X, 其中X是I 中项的一个集合.
关联规则是下面形式的蕴涵式:
X Y, 其中 X, Y I, 且 X Y =
项集 (itemset) 是项的一个集合.
比如, X = {milk, bread, cereal} 是一个项集.
一个k-项集是含有k个项的项集.
比如, {milk, bread, cereal} 是一个3-项集.
规则的强度度量
支持度: 如果事务数据库T 中包含X Y 的事务占sup%, 我们称关联规则X Y 的支持度 为sup%.
sup% = Pr(X Y).
置信度:如果事务数据库T 中包含X 的事务中有conf%的事务包含Y, 我们称关联规则X Y 的置信度为conf%.
conf% = Pr(Y | X)
关联规则是一种说明当 X 出现时, Y 也以某个概率出现的模式.
支持度和置信度
支持度计数: 在事务数据库T中项集X的支持度计数, 记作X.count, 是T中包含X的事务个数. 假设T 有 n 个事务.
则,
目标和关键特征
目标: 寻找满足用户指定的最小支持度 (minsup) 和最小置信度 (minconf) 的所有规则.
满足: 不低于
关键特征
完备性: 寻找所有规则.
规则右边没有目标项.
从存放于磁盘 (非内存) 的数据中挖掘.
例子
t1: Beef, Chicken, Milk
t2: Beef, Cheese
t3: Cheese, Boots
t4: Beef, Chicken, Cheese
t5: Beef, Chicken, Clothes, Cheese, Milk
t6: Chicken, Clothes, Milk
t7: Chicken, Milk, Clothes
频繁项集的子集也是频繁的
频繁项集的一个例子:
{Chicken, Clothes, Milk} [sup = 3/7]
从该项集生成的关联规则:
Clothes Milk, Chicken [sup = 3/7, conf = 3/3]
… …
Clothes, Chicken Milk, [sup = 3/7, conf = 3/3]
算法步骤
两个步骤:
寻找所有不低于最小支持度的项集 (频繁项集, 又称大项集).
使用频繁项集生成规则.
算法例子
minsup=0.5
项集:支持度计数
1. 扫描T
C1: {1}:2, {2}:3, {3}:3, {4}:1, {5}:3
F1: {1}:2, {2}:3, {3}:3, {5}:3
C2: {1,2}, {1,3}, {1,5}, {2,3}, {2,5}, {3,5}
2. 扫描T
C2: {1,2}:1, {1,3}:2, {1,5}:1, {2,3}:2, {2,5}:3, {3,5}:2
F2: {1,3}:2, {2,3}:2, {2,5}:3, {3,5}:2
C3: {2, 3,5}
3. 扫描T
C3: {2, 3, 5}:2
F3: {2, 3, 5}
package org.digdata.mapreduce.apriori;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class AprioriNode {
public List<String> list = new ArrayList<>();
public AprioriNode(String str) {
super();
this.list = Arrays.asList(str.split(","));
Collections.sort(this.list);
}
public AprioriNode() {
super();
}
public boolean add(String s) {
if (this.list.contains(s) == false) {
this.list.add(s);
Collections.sort(this.list);
return true;
} else {
return false;
}
}
public void remove(int i) {
this.list.remove(i);
}
public List<String> getList() {
return list;
}
public void setList(List<String> list