前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关联规则挖掘算法

关联规则挖掘算法

作者头像
用户1733462
发布2018-09-20 16:56:11
6820
发布2018-09-20 16:56:11
举报
文章被收录于专栏:数据处理

I=\{i_1,i_2,...,i_m\}
I=\{i_1,i_2,...,i_m\}

为所有项目的集合,

D
D

为事务数据库,事物

T
T

是一个项目子集(

T\subseteq I
T\subseteq I

)。每一个事务具有唯一的事务标识

TID
TID

。设

A
A

是一个由项目构成的集合,称为

项集
项集

。事务

T
T

包含项集

A
A

,当且仅当

A\subseteq T
A\subseteq T

。如果项集

A
A

中包含

k
k

个项目,则称其为

K项集
K项集

项集

A
A

在事务数据库

D
D

中出现的次数占总事务的百分比叫做项集的

支持度
支持度

。如果项集的支持度超过用户给定的最小支持度阈值,就称该项集是

频繁项集(或频集)
频繁项集(或频集)

关联规则是形如

X \Rightarrow Y
X \Rightarrow Y

的逻辑蕴含式,其中

X\subset I,Y\subset I
X\subset I,Y\subset I

,且

X\cap Y=\phi
X\cap Y=\phi

如果事务数据库D中有

s\%
s\%

的事务包含

X∪Y
X∪Y

, 则称关 联规则

X⇒Y
X⇒Y

的⽀持度为

s\%
s\%

关联规则的信任度为

support (X∪Y)/support (X)
support (X∪Y)/support (X)

也就是:

support (X⇒Y)=P (X ∪Y)
support (X⇒Y)=P (X ∪Y)
confidence (X⇒Y)=P (Y | X)
confidence (X⇒Y)=P (Y | X)

强关联规则就是⽀持度和信任度分别满⾜⽤户 给定阈值的规则

例子

交易ID

购买的商品

2000

A,B,C

1000

A,C

4000

A,D

5000

B,E,F

设最⼩⽀持度为50%, 最⼩可信度为 50%, 则可得到

  • A ⇒ C (50%, 66.6%)
  • C ⇒ A (50%, 100%)

Apriori算法

命名源于算法使⽤了频繁项集性质的先验( Prior) 知识。

Apriori算法将发现关联规则的过程分为两个步骤:

  • 通过迭代, 检索出事务数据库中的所有频繁 项集, 即⽀持度不低于⽤户设定的阈值的项集;
  • 利⽤频繁项集构造出满⾜⽤户最⼩信任度的 规则。
  • 挖掘或识别出所有频繁项集是该算法的核⼼, 占整个 计算量的⼤部分

Apriori的性质

性质1: 频繁项集的所有⾮空⼦集必为频繁项集。

性质2: ⾮频繁项集的超集⼀定是⾮频繁的。

Apriori的步骤

连接步: 为找Lk,通过将Lk-1与⾃⾝连接产⽣候选k项集 的集合

剪枝步: Ck是Lk 的超集, 也就是说, Ck的成员可以是 也可以不是频繁的, 但所有的频繁k项集都包含在Ck中。 任何⾮频繁的( k-1) 项集都不是频繁k项集的⼦集

Apriori算法实例

现有A、 B、 C、 D、 E五种商品的交易记录表, 试找出 三种商品关联销售情况(k=3), 最小支持度=50%

交易号

商品代码

100

A,C,D

200

B,C,E

300

A,B,C,E

400

B,E

读入数据

代码语言:javascript
复制
data = {'交易号':range(100,500,100),'商品代码':['A,C,D', 'B,C,E', 'A,B,C,E', 'B,E']}
df_data = pd.DataFrame(data=data)

算一个事务集在事务数据库的支持度

代码语言:javascript
复制
def get_score(values):
    score = 0.0
    b = True
    for value_code in df_data['商品代码'].values:
        b = True
        for value in values:
            if value not in value_code:
                b = False
                break
        if b is True:
            score += 1              
    return score/len(df_data)

首先构造等候集C

代码语言:javascript
复制
c = []
for code in df_data['商品代码'].values:
    for _ in code.split(','):
        if {_} not in c:
            c.append({_})

输出c

代码语言:javascript
复制
 [{'A'}, {'C'}, {'D'}, {'B'}, {'E'}]

计算L

代码语言:javascript
复制
from collections import defaultdict

score = 0.5
# 这里用字典来保存频繁项集
L = defaultdict(list)
i = 0
length = len(c)
while c:
    i += 1
    for ci in c:
        if get_score(ci) >= score:
            L[i].append(ci)
    print L[i]
    c = get_c(L[i])
代码语言:javascript
复制
[set(['A']), set(['C']), set(['B']), set(['E'])]
[set(['A', 'C']), set(['C', 'B']), set(['C', 'E']), set(['B', 'E'])]
[set(['C', 'B', 'E'])]

可以得出三种商品关联销售情况(k=3), 最小支持度=50%只有一组(CBE)

Apriori算法的不⾜

C_k
C_k

中的项集是⽤来产⽣频集的候选集.

  • 最后的频集
L_k
L_k

必须是

C_k
C_k

的⼀个⼦集。

C_k
C_k

中的每个元素需在交易数据库中进⾏验证来决定其是否加 ⼊

L_k
L_k
  • 验证过程是性能瓶颈 交易数据库可能⾮常⼤ ⽐如频集最多包含10个项, 那么就需要扫描交易数据库10遍 需要很⼤的I/O负载。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Apriori算法
  • Apriori的性质
  • Apriori的步骤
  • Apriori算法实例
  • Apriori算法的不⾜
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档