机器学习之Apriori

1 几个概念:
(1)关联分析:一种在大规模数据中寻找有趣关系的任务。这种有趣关系一般有两种形式:频繁项集或者关联规则。
(2)频繁项集:经常,频繁出现在一起的物品集合,通常用一对{}来表示。
(3)关联规则:两种物品之间存在的关联关系,通常用“这里写图片描述”表示。
(4)支持度:这是用来衡量频繁项集的因子。一个项集的支持度即为一个数据集中包含该项集的记录所占的比例。
(5)可信度(置信度):这是用来衡量关联规则的因子。
比如:一个商店的交易清单,这里只有豆奶,莴苣,尿布和葡萄酒这四种商品:
这里写图片描述
上表中{尿布,葡萄酒},{尿布}等就是一个频繁项集, “尿布这里写图片描述葡萄酒”为一个关联规则。上表中{尿布,葡萄酒}在整表中占3/5,所以,{尿布,葡萄酒}这个项集的支持度为3/5,{尿布}在整表中占4/5,所以,{尿布}这个项集的支持度为4/5。“尿布这里写图片描述葡萄酒”这个关联规则的可信度为“支持度({尿布,葡萄酒})/支持度({尿布})”,即(3/5)/(4/5)=75%。

2 Apriori原理
以下是4种商品{0,1,2,3}所有可能的项集组合:
这里写图片描述
Apriori的目的就是找到频繁项集,因为只有先找到频繁项集才能进一步从中挖掘关联规则,最终才能得到大规模数据中有趣的关系。
寻找频繁项集就是去掉一些支持度小的项集。
这里写图片描述
比如上图中,如果{2,3}这个项集我们算出它的支持度很小,属于非频繁项集,那么显然,所有包括{2,3}项集的项集也是非频繁的,那么也就不用再计算他们的支持度,减少计算量。所以,上图中的{0,2,3},{1,2,3},{0,1,2,3}这三种项集可以去掉。

3 实现
1)生成所有的频繁项集
伪代码:
这里写图片描述
实现:

def scanD(dataSet, Ck, minSupport):
    D=map(set,dataSet)
    ssCnt = {}
    #记录整个数据集中每个元素出现的次数
    #{frozenset([4]): 1, frozenset([5]): 3, frozenset([2]): 3, frozenset([3]): 3, frozenset([1]): 2}
    for tid in D: #遍历每条数据列表
        for can in Ck:  #遍历每个数据元素
            if can.issubset(tid):
                if not ssCnt.has_key(can): ssCnt[can]=1
                else: ssCnt[can] += 1
    numItems = float(len(D)) #4
    retList = []
    supportData = {}
    for key in ssCnt: #为每一个ssCnt字典里的元素计算支持度support
        support = ssCnt[key]/numItems
        if support >= minSupport:  #将小于支持度阈值的项集去掉,剩下的当做频繁项集
            retList.insert(0,key)
        supportData[key] = support
        #retList=[frozenset([1]), frozenset([3]), frozenset([2]), frozenset([5])]
        #supportData=
     # {frozenset([4]): 0.25, frozenset([5]): 0.75, frozenset([2]): 0.75, frozenset([3]): 0.75, frozenset([1]): 0.5}
    return retList, supportData

2)组织完整的Apriori算法
根据支持度,找到频繁项集
伪代码:
这里写图片描述
实现:

def apriori(dataSet, minSupport = 0.5):
    C1 = createC1(dataSet)  #数据集中所有大小为1的项集集合
    D = map(set, dataSet)
    #L1为所有大小为1的频繁项集集合
    #supportData为所有大小为1的项集支持度
    L1, supportData = scanD(D, C1, minSupport)
    L = [L1]
    k = 2
    while (len(L[k-2]) > 0):
        Ck = aprioriGen(L[k-2], k) #由上一层频繁项集,创建下一层所有可能项集组合的集合Ck
        Lk, supK = scanD(D, Ck, minSupport)#选择符合支持度的频繁项集Lk
        supportData.update(supK)
        L.append(Lk)
        k += 1
    return L, supportData

3)根据可信度,挖掘关联规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值