机器学习经典算法10-Apriori

1.关联分析

        通过查看哪些商品经常在一起购买,可以帮助商店了解用户的购买行为。这种从大量数据中抽取的知识可用于商品定价、市场促销、存货管理等环节。所谓关联,反映的是一个事物和其他事物之间依赖或关联的知识。从大规模数据集中寻找事物间的隐含关系称为关联分析(association analysis)或者关联规则学习(association rule mining)。
        在关联分析中,事物之间的关系较为常用的有两种:频繁项集和关联规则。频繁项集(frequent item sets)是经常出现在一起的物品集合,关联规则(association rules)则暗示两个物品之间可能存在很强关系。

2.基本定义


3.Apriori

       对于频繁项集挖掘的任务,可以使用暴力求解方法,没每个可能的项集进行support计算,然后通过minSupport进行过滤,但是这样过于费时。
Apriori原理中,如果某个项集是频繁的,则其所有子集也是频繁的。反过来说,也就是说某个项集是非频繁的,那么其所有超集也是非频繁的。所以在进行频繁项集挖掘时,从1-项集开始,基于minSupport进行过滤,对过滤后的项集进行排列组合,形成2-项集,然后基于minSupport进行过滤,这样以此下去,一直到形成的k-项集中只有1个元素为止。

4.实现示例

         aprioriGen用于产生新的候选集合列表,这里用了一个技巧,即(根据Apriori原则)需要对k-1的频繁项集进行排列组合生成Ck,在进行排列组合的时候,用两个for循环,如果两个元素(元素内部是有序的)的[0,k-2)个元素相同则进行合并,避免计算量过大;函数scanD用于统计候选集合列表Ck中各个项集的频率,并基于minSupport进行过滤;在进行generateRules时,即产生关联规则,根据Apriori原理,右边显示单个项集,然后慢慢增加。
        其他说明:python字典的update函数可以将两个字典进行合并,具体合并规则还请自行查阅;选择list的一部分[:k],当k等于0的时候,获得是[];python中对set支持|操作,即计算并集。
from numpy import *
import matplotlib.pyplot as plt
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 [item] not 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
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
def generateRules(L, supportData, minConf=0.7):
    bigRuleList=[]
    for i in range(1,len(L)):
        for freqSet in L[i]:
            H1=[frozenset([item]) for item in freqSet]
            if(i>1):
                rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
            else:
                calcConf(freqSet, H1, supportData, bigRuleList, minConf)
    return bigRuleList
def calcConf(freqSet, H, supportData, br1, minConf=0.7):
    prunedH=[]
    for conseq in H:
        conf = supportData[freqSet]/supportData[freqSet-conseq]
        if conf>minConf:
            print freqSet-conseq, "-->", conseq,'conf:',conf
            br1.append((freqSet-conseq, conseq, conf))
            prunedH.append(conseq)
    return prunedH
def rulesFromConseq(freqSet, H, supportData, br1, minConf=0.7):
    m=len(H[0])
    if(len(freqSet)>m+1):
        Hmp1=aprioriGen(H,m+1)
        Hmp1=calcConf(freqSet, Hmp1, supportData, br1, minConf)
        if(len(Hmp1)>1):
            rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)
dataSet=loadDataSet()
L, supportData = apriori(dataSet)
print L
print supportData
rules=generateRules(L, supportData,0.5)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大胖5566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值