机械学习算法小结(11)——Apriori算法关联分析

使用Apriori算法进行关联分析

 

一、关联分析:可以在大规模大数据中寻找数据中存在的有趣关系。

经过关联分析的数据可以有两种形式的关系存在:

①频繁项集(frequent item sets):支持度大于预定义的最小支持度阈值的项集。也就是经常出现的在一起的数据的集合。(支持度:表示前项与后项在一个数据集中同时出现的频率。)

②关联规则:(association rules):关联规则是形如X→Y的蕴涵式,其中, X和Y分别称为关联规则的先导和后继。其中,关联规则XY,存在支持度和置信度。也就是暗示两种物品之间存在很强的关系。(置信度:  置信度表示在先决条件X发生的情况下,由关联规则”X→Y“推出Y的概率。)

二、下面用实例来详细了解。

机械学习算法小结(11)——Apriori算法关联分析_第1张图片

1、由图中杂货铺的数据实例:

支持度:豆奶 :交易中出现的次数(4)/一共交易的次数(5)=4/5     ;豆奶+莴苣:3/5     这便是数据的支持度

关联规则 :我们举例 设 最小支持度=0.5  最小置信度 = 0.4    取数据中: 尿布 + 葡萄酒

由表中数据看出: 1,2,3,4 都有尿布, 1,2,3都有尿布+葡萄酒     

则有:尿布+葡萄酒 的支持度 = 3/5  > 最小支持度 0.5 即为频繁项集。

   尿布的支持度= 4/5  

所以:尿布+葡萄酒的置信度= 3/5   /  4/5  =3/4 =0.75  >最小置信度0.4   

所以 :尿布与葡萄酒存在关联。 

2、支持度和置信度就是用来量化关联分析的一个一种方法。

倘若我们要是想寻找支持度80%以上项集,便需要将数据集元素的组合全部列举出来然后进行频率计算,如果遇到大量数据,这种方法也就不合适了,因此,我们便引入Apriori 算法来帮助我们。

三、Apriori算法

1.什么是Apriori算法?

Apriori算法是使用一种称作逐层搜索的迭代方法。

(1)通过遍历数据集,获得所有的频繁1项集。(如果事件A中包含k个元素,那么称这个事件Ak项集,并且事件A满足最小支持度阈值的事件称为频繁k项集。频繁1项集即为k=1时。)记作L1。然后利用L1 找到频繁2项集的集合,L2找L3,如此下去,直到再也找不出任何频繁k项集。最后在所有的频繁集中找出强规则,也就是我们认为的规则。

例:[[1,3,5,],[2,3,4],[1,2,3],[1,2,4,5],[1,2,3,4]]   设 支持度为0.5

该数集中所有的1项集为:[1] ,[2], [3], [4] ,[5]

则根据支持度大于最小支持度的原则,所有的频繁1项集为: [1], [2], [3], [4]   所以:L1 = [[1],[2],[3],[4]]

则L2的获得 就需要将L1 中的元素全部混合搭配,然后求出每个2项集的支持度,即获得频繁2项集。

普通2项集为[1,2][2,3][3,4][1,3][1,4][2,4]则频繁2项集为[[1,2][2,3][2,4][1,3]]

以此类推,直到找不出频繁K项集。

(2)Apriori算法有一条性质:任意频繁项集的所有非空子集也是必须是频繁的。因为假如P(I) < 最小支持度的阈值,

当所有元素A添加到I中时,结果项集(A∩I)不可能比I出现的次数更多。因此A∩I 也不是频繁的。

         从上面的例子理解就是:已知[1,4] 不是频繁项集,如果将元素3 添加入[1,4],[1,3,4]项集 也肯定不是频繁项集。

          因为1,4的频率已经不足,多余一个3 也没有任何意义 ,1,3,4同时出现的几率是建立在14同时出现的基础上。

2、连接步和剪枝步

         (1)连接步:若有两个k-1项集,每个项集按照“属性-值”(一般按值)的字母顺序进行排序。如果两个k-1项集的前k-2个元素相同,而最后一项不同,则证明他们是可以连接的,可以连接生成k项集。

            举例:[1,2,3] 和[1,2,4]他们可以连接生成[1,2,3,4],而[1,2,3][2,3,4],两个两项集的前k-2不同,便不是连接步。

          (2)剪枝步:若一个项集的子集不是频繁项集,那这个项集肯定也不是频繁项集。原因可以通过上面的性质推出。

3. Apriori算法流程

           (1).首先读取数据集,计算出每个1项集的支持度,确定频繁1项集。(因此,我们定义的函数参数中应该有一个参数为我们定义的最小支持度support=___)

            (2)从2项集开始循环,由频繁k-1项集生成频繁k项集。

连接步:为了预先生成频繁项集,将两个不同的项进行JOIN运算,得到频繁k项集,以减少运算。

剪枝步:同理,为了方便运算,将不是频繁项集的1项集,将包含一项集的元素排出。

扫描数据库,计算之前2.1过滤后得到的k项集,计算支持度,舍弃掉非频繁项集。

            (3)当当前的频繁k项集,只有一个项集时 跳出循环。

注意:

在剪枝步中的每个元素需要在数据库中进行验证来决定是否加入,这里的验证过程是算法的一个瓶颈,这个方法要求:多次扫描很大的数据库,可能产生大量的候选集,以及可能需要重复扫面数据库,这Apriori算法的两大缺点。

Apriori算法实例

 

交易ID

商品ID列表

T100

I1,I2,I5

T200

I2,I4

T300

I2,I3

T400

I1,I2,I4

T500

I1,I3

T600

I2,I3

T700

I1,I3

T800

I1,I2,I3,I5

T900

I1,I2,I3

上面表格是9次交易记录。下面我们可以通过上面的Apriori算法流程构思一下。

首先,我们获得1项集C1={[I1],[I2],[I3],[I4],[I5]},支持度分别为:6/9、7/9、6/9、2/9、2/9   我们预设最小支持度为:2/9

所以确定频繁1项集L1 = {[I1],[I2],[I3]}  由L1 组合 得到 C2项集={[I1,I2],[I1,I3][I1,I4][I1,I5][I2,I3][I2,I4][I2,I5][I3,I4][I3,I5]

[I4,I5]},支持度次数分别为{4,4,1,2,4,2,2,0,1,0},然对C2 进行计算,排出剩余的非频繁2项集,得到频

繁2项集L2={[I1,I2][I1,I3][I2,I3][I1,I5][I2,I4][I2,I5]},接下来对频繁2项集中的数据首先进行连接,生成3项集={[I1,I2,I3],

[I1,I2,I5][I2,I4,I5],[I2,I3,I4][I2,I3,I5]},此时应用剪枝,将含有[I1,I4],[I3,I4][I3,I5][I4,I5]这些非频繁项集的3项集排除,得到C1=

{[I1,I2,I3],[I1,I2,I5]} 分别计算支持度[2 ,2] ,则 频繁3项集L3={I1,I2,I3],[I1,I2,I5]} ,继续通过连接,得到4项集{[I1,I2,,I3,I5]}

支持度为1/9 < 2/9  所以:  我们返回 上一次的计算结果。即L3.作为我们分析关联规则的频繁多项集。

import numpy as np

def loadDataSet():
    return [[1,3,5],[1,2,3,4],[2,3,4,5],[2,4],[1,3,4],[2,5],[1,2,3,4,5]]

def creatC1(dataSet):
    C1 = []
    for i in dataSet:
        for item in i:
            if not [item] in C1:
                C1.append([item])
    print("sort‘从小到大排序前’C1=",C1)
    C1.sort()
    print("sort排序后=",C1)
    print('frozenset=', map(frozenset, C1))
    return list(map(frozenset, C1 ))
def hou_xuan_D(D,C,minsupport):
    zhi_chi_ci_shu = {}
    for a in D:
        for b in C:
            if b.issubset(a):
                if not a in zhi_chi_ci_shu:
                    zhi_chi_ci_shu[a] = 1
                else:
                    zhi_chi_ci_shu[a] += 1
    D_de_shu_liang = float(len(D))                      #后面需要计算支持度
    pin_fan_list = []                                   #支持度大于最小支持度的集合
    zhi_chi_du_dataSet={}
    for c in zhi_chi_ci_shu:
        support = zhi_chi_ci_shu[c] / D_de_shu_liang
        if support >= minsupport:
            pin_fan_list.istert(0,c)                    #0是要插入到的索引值,c是插入的对象。
        zhi_chi_du_dataSet[c] = support
    return pin_fan_list,zhi_chi_du_dataSet      

dataSet = loadDataSet()
D = list(map(set,dataSet))
D

C=creatC1(dataSet)
C

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(机械学习算法小结(11)——Apriori算法关联分析)