Apriori算法

本文介绍了Apriori算法的基本原理及其实现过程,包括频繁项集和支持度的概念,并通过具体实例解释了如何利用该算法发现数据间的关联关系。

在讨论这个算法之前需要知道什么是频繁项集以及关联规则,频繁项集是经常出现在一块的集合,关联规则是暗示两种物品之间有很强的关系。今天这个算法就是解决这个问题的,首先我们讨论频繁项集,支持度是频繁项集频繁的一个重要指标,支持度越高说明频繁程度越高。举个例子:比如有五组商品,其中出现某一种商品的次数是二,那么它的支持度就是2/5,如果某两种商品组合出现在一起的次数是1,那么它的支持度就是1/5,这就是支持度的定义,接下来就可以讨论频繁项集了:

from numpy import *

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
上面的第二个函数建立的是第一个候选集列表,该列表中记录的是单个项集,为什么单独一个函数创建但个项集,一会就看到。接下来第三个函数计算支持度,输入参数为数据集候选项集和最小支持度,首先创建一个字典,键是候选项集,值是该候选项在数据集中出现的次数,for循环遍历整个数据集和候选项集记录候选项集出现的次数。最后计算支持度,如果满足就将其添加到列表中。

def aprioriGen(Lk, k): 
    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
上面第一个函数输入参数为频繁项集列表和项集元素个数,这个函数用来生成组合的频繁项集,这里有一个k-2,当用包含多项的项集进行组合时,同样的组合会出现三次,所以取其中的一次即可,这里也就是为什么一个项集的组合要单独一个函数实现。下面一个函数是整体调用函数,最后输出满足最小支持度的项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值