Apriori进行关联分析

算法概述

优点:易编码实现
缺点:在大数据集下可能较慢
适用数据类型:数值型或标称型数据

在大规模数据集中寻找物品间的隐含关系被称为关联分析

我们的目标就是找到经常在一起出现的频繁子集。我们用大括号“{}”来表示集合。为了表示某个子集是否是频繁子集,我们需要用一些量化方法,光计数也不行,因为不同量的交易数据出现的次数差别很大,一般用支持度(support)和置信度(confident)这两个指标来量化频繁子集、关联规则。这两个指标的计算都很简单:

支持度=(包含该子集的交易数目)/总交易数目

置信度只是针对像{尿布}->{葡萄酒}的关联规则来定义的:

尿布到葡萄酒的置信度=支持度({尿布,葡萄酒})/支持度(尿布)

生成候选项集

伪代码:

对数据集中的每条交易记录tran
对每个候选项集can:
    检查一下can是否时tran的子集:
    如果是,则增加can的计数值
对每个候选项集
如果其支持度不低于最小值,则保留该项集
返回所有频繁项集列表
辅助函数代码
def loadDataSet():
    return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
 
def createC1(dataSet):
    C1 = []
    for transaction in dataSet:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])
                
    C1.sort()
    return map(frozenset, C1)
                            
 
def scanD(D, Ck, minSupport):
    ssCnt = {}
    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))
    retList = []
    supportData = {}
    for key in ssCnt:
        support = ssCnt[key]/numItems
        if support >= minSupport:
            retList.insert(0,key)
        supportData[key] = support
    return retList, supportData
整个算法

伪代码:

当集合中项的个数大于0时
    构建一个k个项组成的候选项集的列表
    检查数据以确认每个项集都是频繁的
    保留频繁项集并构建k+1项促成的候选项集的列表
代码
def aprioriGen(Lk, k): #creates Ck
    retList = []
    lenLk = len(Lk)
    for i in range(lenLk):
        for j in range(i+1, lenLk): 
            L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]
            L1.sort(); L2.sort()
            if L1==L2: 
                retList.append(Lk[i] | Lk[j]) 
    return retList
 
def apriori(dataSet, minSupport = 0.5):
    C1 = createC1(dataSet)
    D = map(set, dataSet)
    L1, supportData = scanD(D, C1, minSupport)
    L = [L1]
    k = 2
    while (len(L[k-2]) > 0):
        Ck = aprioriGen(L[k-2], k)
        Lk, supK = scanD(D, Ck, minSupport)	
        supportData.update(supK)
        L.append(Lk)
        k += 1
    return L, supportData
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值