php关联规则,关联规则(挖掘),数据关联(融合) | 学步园

关联规则挖掘是数据挖掘的重要技术,用于发现数据项间的相关性。Apriori算法是最具影响力的挖掘算法之一,但存在效率问题。FP-Growth算法通过构建FP树改进了Apriori,减少了数据库扫描次数。Eclat算法则采用倒排思想,加速频繁项集生成。这些算法在市场篮子分析、商品推荐等领域有广泛应用。
摘要由CSDN通过智能技术生成

关联式规则(Association Rules, AR),又称关联规则,是数据挖掘的一个重要课题,用于从大量数据中挖掘出有价值的数据项之间的相关关系。关联规则解决的常见问题如:“如果一个消费者购买了产品A,那么他有多大机会购买产品B?”以及“如果他购买了产品C和D,那么他还将购买什么产品?”正如大多数数据挖掘技术一样,关联规则的任务在于减少潜在的大量杂乱无章的数据,使之成为少量的易于观察理解的静态资料。

关联规则一个经典的实例是购物篮分析(Market

Basket Analysis)。超市对顾客的购买记录数据库进行关联规则挖掘,可以发现顾客的购买习惯,例如,购买产品X的同时也购买产品Y,于是,超市就可以调整货架的布局,比如将X产品和Y产品放在一起,增进销量。

基本概念

表1:关联规则的简单例子

TID

网球拍

网 球

运动鞋

羽毛球

1

1

1

1

0

2

1

1

0

0

3

1

0

0

0

4

1

0

1

0

5

0

1

1

1

6

1

1

0

0

根据韩家炜等

假设

2626dd9e9908e639ab94e90ff395d327.png是项的集合。给定一个交易数据库

c74b06cd99c49a3e97598e69ecce6102.png,其中每个事务(Transaction)t是I的非空子集,即

824b8a789da64386ce611f147c39a269.png,每一个交易都与一个唯一的标识符TID(Transaction

ID)对应。关联规则是形如

104497334acd46620d084cca9a17e4c8.png的蕴涵式,其中

f3112d7dd6240fa5b2f4793ba7a9123c.png

e8a9af1c269bdfc410721f0a938da421.png

02129bb861061d1a052c592e2dc6b383.png

57cec4137b614c87cb4e24a3d003a3e0.png分别称为关联规则的先导(antecedent或left-hand-side,

LHS)和后继(consequent或right-hand-side, RHS) 。关联规则

104497334acd46620d084cca9a17e4c8.png在D中的支持度(support)是D中事务包含

74da4429354a80f686996145d3a74c2c.png的百分比,即概率0a43c9107666eebe636deff4f78999b4.png;置信度(confidence)是包含X的事务中同时包含Y的百分比,即条件概率9005a9ec76d920c648c4c2e8a758e6c2.png。如果同时满足最小支持度阈值和最小置信度阈值,则认为关联规则是有趣的。这些阈值由用户或者专家设定。

用一个简单的例子说明。表1是顾客购买记录的数据库D,包含6个事务。项集I={网球拍,网球,运动鞋,羽毛球}。考虑关联规则:网球拍

df09aea884019cb88a2957126faba316.png网球,事务1,2,3,4,6包含网球拍,事务1,2,6同时包含网球拍和网球,支持度

6265458da7090ab1c78e29ddd4a9831f.png,置信度

c9e5122134f3ce2238e1bc024b720dfa.png。若给定最小支持度

a48c2e41b0a73cd3352377ec9791bca8.png,最小置信度

78268e9f3fb8b66f3ac2ee67b5fe5fa4.png,关联规则网球拍

df09aea884019cb88a2957126faba316.png网球是有趣的,认为购买网球拍和购买网球之间存在强关联。

分类

关联规则有以下常见分类

根据关联规则所处理的值的类型

如果考虑关联规则中的数据项是否出现,则这种关联规则是

如果关联规则中的数据项是数量型的,这种关联规则是

df09aea884019cb88a2957126faba316.png购买("网球拍"),年龄是一个数量型的数据项。在这种关联规则中,一般将数量离散化(discretize)为区间。

根据关联规则所涉及的数据维数

如果关联规则各项只涉及一个维,则它是单维关联规则(single-dimensional association rules),例如购买("网球拍")

df09aea884019cb88a2957126faba316.png购买("网球")只涉及“购买”一个维度。

如果关联规则涉及两个或两个以上维度,则它是多维关联规则(multi-dimensional association rules),例如年龄("20-25")

df09aea884019cb88a2957126faba316.png购买("网球拍")涉及“年龄”和“购买”两个维度。

根据关联规则所涉及的抽象层次

如果不涉及不同层次的数据项,得到的是单层关联规则(single-level association rules)。

在不同抽象层次中挖掘出的关联规则称为

df09aea884019cb88a2957126faba316.png购买("HEAD网球拍")和年龄("20-25")

df09aea884019cb88a2957126faba316.png购买("网球拍")是广义关联规则,因为"HEAD网球拍"和"网球拍"属于不同的抽象层次。

Apriori 算法

Apriori算法是种最有影响的挖掘布尔关联规则频繁项集的算法。它的核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集(简称频集),也常称为最大项目集。

在Apriori算法中,寻找最大项目集(频繁项集)的基本思想是:算法需要对数据集进行多步处理。第一步,简单统计所有含一个元素项目集出现的频数,并找出那些不小于最小支持度的项目集,即一维最大项目集。从第二步开始循环处理直到再没有最大项目集生成。循环过程是:第k步中,根据第k-1步生成的(k-1)维最大项目集产生k维侯选项目集,然后对数据库进行搜索,得到侯选项目集的项集支持度,与最小支持度进行比较,从而找到k维最大项目集。

下面以图例的方式说明该算法的运行过程: 假设有一个数据库D,其中有4个事务记录,分别表示为:

TID

Items

T1

I1,I3,I4

T2

I2,I3,I5

T3

I1,I2,I3,I5

T4

I2,I5

这里预定最小支持度minSupport=2,下面用图例说明算法运行的过程:

TID

Items

T1

I1,I3,I4

T2

I2,I3,I5

T3

I1,I2,I3,I5

T4

I2,I5

扫描D,对每个候选项进行支持度计数得到表C1:

项集

支持度计数

{I1}

2

{I2}

3

{I3}

3

{I4}

1

{I5}

3

比较候选项支持度计数与最小支持度minSupport,产生1维最大项目集L1:

项集

支持度计数

{I1}

2

{I2}

3

{I3}

3

{I5}

3

由L1产生候选项集C2:

项集

{I1,I2}

{I1,I3}

{I1,I5}

{I2,I3}

{I2,I5}

{I3,I5}

扫描D,对每个候选项集进行支持度计数:

项集

支持度计数

{I1,I2}

1

{I1,I3}

2

{I1,I5}

1

{I2,I3}

2

{I2,I5}

3

{I3,I5}

2

比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2:

项集

支持度计数

{I1,I3}

2

{I2,I3}

2

{I2,I5}

3

{I3,I5}

2

由L2产生候选项集C3:

项集

{I2,I3,I5}

比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:

项集

支持度计数

{I2,I3,I5}

2

算法终止。

从算法的运行过程,我们可以看出该Apriori算法的优点:简单、易理解、数据要求低,然而我们也可以看到Apriori算法的缺点:(1)在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;(2)每次计算项集的支持度时,都对数据库D中的全部记录进行了一遍扫描比较,如果是一个大型的数据库的话,这种扫描比较会大大增加计算机系统的I/O开销。而这种代价是随着数据库的记录的增加呈现出几何级数的增加。因此人们开始寻求更好性能的算法,如下面要介绍的F-P算法。

F-P算法

针对Apriori算法的性能瓶颈问题-需要产生大量候选项集和需要重复地扫描数据库,2000年Jiawei Han等人提出了基于FP树生成频繁项集的FP-growth算法。该算法只进行2次数据库扫描且它不使用侯选集,直接压缩数据库成一个频繁模式树,最后通过这棵树生成关联规则。研究表明它比Apriori算法大约快一个数量级。

FP-growth算法是一种不产生候选模式而采用频繁模式增长的方法挖掘频繁模式的算法。算法只需要扫描2次数据库:第一次扫描数据库,得到1维频繁项集;第二次扫描数据库,利用1维频繁项集过滤数据库中的非频繁项,同时生成FP树。由于FP树蕴涵了所有的频繁项集,其后的频繁项集的挖掘只需要在FP树上进行。FP树挖掘由两个阶段组成:第一阶段建立FP树,即将数据库中的事务构造成一棵FP树;第二阶段为挖掘FP树,即针对FP树挖掘频繁模式和关联规则。

FP-growth算法描述:

输入:事务数据库D,最小支持度minSupport。

输出:频繁模式的完全集。

方法:

1 构建FP树:

1.1 扫描事务数据库,收集频繁项集F并统计支持度,对F按支持度降序排序,得到频率排序好的项表L。

1.2 创建FP树的根节点,用“null”标记它。对于D中每个事务T,执行:选择T中的频繁项,并按L中的次序排序。设排序后的频繁项表为[p|P],其中p是第一个元素,而P是剩余元素的表。调用insert_tree([p|P],T)。该过程执行情况如下:如果T有子女N使得N.itemName=p.itemName,则N的计数增加1;否则创建一个新节点N,将其计数设置为1,链接到它的父节点T,并且通过节点链结构将其链接到具有相同itemName的节点。如果P非空,递归地调用insert_tree(P,N)。

2 FP树的规则挖掘(通过FP-growth(Tree,α)函数来实现,初始调用FP-growth(Tree,null)):

if Tree含单个路径P then {

for 路径P中节点的每个组合(记作β)

产生模式β∪α,其支持度support=β中节点的最小支持度; }

else for each αi 在Tree的头部 do {

产生模式β=αi ∪ α,其支持度support=αi.support;

构造β的条件模式基,然后构造β的条件FP树Treeβ;

if Treeβ≠空集 then

调用FP_growth(Treeβ,β) }

end

F-P算法实现

Eclat算法

与fp-growth 和apriori算法不同,Eclat算法加入了倒排的思想,具体就是将事务数据中的项作为key,每个项对应的事务ID作为value。

原输入数据为

tid

item

1

A,B

2

B,C

3

A,C

4

A,B,C

转换后为:

item

tids

A

1,3,4

B

1,2,4

C

2,3,4

通过转换后的倒排表可以加快频繁集生成速度。 其算法思想是 由频繁k项集求交集,生成候选k+1项集 。对候选k+1项集做裁剪,生成频繁k+1项集,再求交集生成候选k+2项集。如此迭代,直到项集归一。 根据上述数据的情况,具体计算过程为

算法过程:

1.计算频繁1项集,结果为:

item

freq

A

3

B

3

C

3

2.由频繁1项集生成频繁2项集

item

freq

A,B

2

A,C

2

B,C

2

3.由频繁2项集生成频繁3项集

item

freq

A,B,C

1

频繁k项集生成频繁k+1项集的过程与由1项集生成2项集的过程完全一致。

这里有个隐含的条件是,两个频繁k项集生成k+1项集时,前k-1项是一致的,A,B+A,C==>A,B,C

Eclat算法实现

eclat的核心思想就是倒排,这种数据处理方式很适合用关系型数据表示和实现。 具体可参考用关系型数据结构实现Eclat算法——Hive

参考文献

^ 1.0 1.1 J.

Han, M. Kamber. Data Mining: Concepts and Techniques. Morgan Kaufmann: 2000

Java2D 是 Java 平台提供的一个 2D 图形 API,可以用来创建各种图形、绘制图像、处理颜色、应用纹理等等。下面是一个简单的例子,展示如何使用 Java2D 创建一个简单的图形。 ```java import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JFrame; import javax.swing.JPanel; public class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 设置背景颜色 g2d.setBackground(Color.WHITE); // 设置画笔颜色 g2d.setColor(Color.BLACK); // 创建一个矩形 Rectangle rect = new Rectangle(50, 50, 100, 100); // 填充矩形 g2d.fill(rect); } public static void main(String[] args) { JFrame frame = new JFrame("Java2D Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); MyPanel panel = new MyPanel(); frame.add(panel); frame.setVisible(true); } } ``` 在上面的代码中,我们继承了 JPanel 类,并重写了它的 paintComponent 方法。在该方法中,我们首先调用了父类的 paintComponent 方法,然后获取 Graphics2D 对象,设置了背景颜色和画笔颜色,并创建了一个矩形,最后使用 fill 方法填充矩形。 在 main 方法中,我们创建了一个 JFrame 对象,设置了标题和大小,创建了一个 MyPanel 对象,并将它添加到 JFrame 中,最后设置 JFrame 可见。运行程序,你会看到一个黑色的矩形在白色的背景上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值