【信息系统】原理模块-Apriori频繁项集及关联特征算法

频繁项集及关联特征算法

     实际场景:使用搜索引擎或者机器客服等信息查询系统时,当请求查询者输入一部分查询内容时,系统即可按照可能性大小,列举出用户可能想要查询的内容选项。

     原理:通过搜集大量的历史查询记录,分析数据中的频繁项集及关联特征,以及自动推荐用户可能期望的查询内容


名词解释:

    频繁项集(frequent item sets)是指经常出现在一起的物品或信息的集合

    关联规则:(association rules)   暗示两种物品或者信息之间可能存在很强的关系


例如我们使用百度搜索:“为什么.......”时,系统已经自动推荐了我们可能期望查询的内容

    由于使用百度的用户基数特别大, 查询的广度也非常大,导致很多时候自动推荐的内容都会比较奇怪,往往和时下的热点有关。


    但我们将此项技术运用到针对性较强的信息查询系统中(如学校、机构、公司等),即可通过分析历史数据,自动为请求者推送十分有用的信息。


Part One:频繁项集

    在我们寻找一个很大的数据集中的频繁项集时,我们应该用什么来界定“频繁”呢?-----支持度

一个项集的支持度就是该项集出现在整个数据集中的比例。


Apriori算法计算频繁项集的方法很简单

    第一步:分析数据集,将信息拆解为最小单元集合

    第二步:测算各个最小单元集合的支持度

    第三步:组合满足最小值支持度的最小单元,生成由两个最小单元组成的集合

    第四步:重复第二步,不过是测算组合之后的集合的支持度

    第五步:重复第三步

    ......

    直到无任何集合满足最小支持度时停止


    但仅仅只有五个基本信息单元时全部就需要测算几十次,计算量太大了。

为了降低计算的时间,可以利用Apriori原理:如果某个项集时频繁的,那么他的子集也一定是频繁的。
反之如果某个项集是非频繁的,那么他的超集也一定是非频繁的

程序1-1:生成最小单元集

def createBaseCollection(dataSet):
    BaseCollection=[]

    for transaction in dataSet:
        for item in transaction:
            if not [item] in C1:
                C1.append([item])
    C1.sort()
    return map(frozenset,C1)

采用UTF-8编码,中文一个字符有3个byte编码 

\xe4\xbf\x9d为“保”   

\xe5\x8d\xab为“卫” 

\xe5\xa4\x84为“处”


程序1-2:测算项集支持度

返回满足最小支持度的项集,及当前项集的支持度数据

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


程序1-3:生成下一级项集

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

程序1-4:Apriori支持度测算

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

测算关联特征(用可信度来度量)

p->h:可信度 为   P(p并h)/   P(p)(P支持度)

 优化:如果某条规则如012->3不满足最小可信度,则该规则的子集也不满足最小可信度的要求。


程序2-1:关联规则生成函数

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

这是一个主函数,分别调用其他用两个函数,分别用于生成候选规则集合以及对规则进行评估

L:频繁项集列表   supportData:包含哪些频繁项集支持数据的字典   minConf:最小可信度阈值

@param return  bigRuleList :包含可信度的规则列表

函数流程:遍历L中的每一个频繁项集并对每个频繁项集创建只包含单个元素集合的列表H1







猜你喜欢

转载自blog.csdn.net/AntioniaMao/article/details/79615957