分享

基础算法-关联分析

 量化猫 2017-05-03

1

什么是关联分析?

超市出售的货品种类繁多,但是有一个很有趣的现象:购买啤酒的消费者通常也会购买尿片。这看似荒唐的现象是由美国的一家超市进行数据关联分析时发现的,后期通过访问得知一般婴儿的父亲在下班后被老婆告知去超市为孩子买些尿片,父亲在采购尿片的过程中也会为自己买一些啤酒解乏。关联分析就是可以发现这样一种事物间内在关联的数据分析方法。

2

关联分析简例


有5种货品,分别是1:菠萝2:布丁3:奶酪4:纸巾5:汽水。

我们记录了4位消费者的购物记录清单,分别是:{菠萝,奶酪,纸巾};{布丁,奶酪,汽水};{菠萝,布丁,奶酪,汽水};{布丁,汽水}。

作为超市的经营管理者我们希望找到顾客购物的某些习惯从而调整营销策略,通过关联分析得到最终结果:购买“汽水”的顾客购买“布丁”的概率是100%;购买“菠萝”的顾客购买“奶酪”的概率是100%;购买“布丁”的顾客购买“汽水”的概率是100%。


3

算法简介:

支持度定义:某类目出现的次数占总样本数的比例,如菠萝出现在了2位顾客的清单中,所以菠萝的支持度是2/4。

可信度定义:事件“因果”的支持度与事件“因”的支持度的比值,如“汽水布丁”组合的支持度是3/4,汽水的支持度是3/4,所以由汽水“因”导致布丁“果”的可信度是100%。

关联分析就是首先找出基础类目的支持度,并以自定义的最小支持度为过滤条件,最终找到各类关联事件的可信度,以自定义的最小可信度为过滤条件,得到理想的关联事件。

4

代码实现:

#这是一个APRIORI关联算法

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


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,supX=scanD(D,Ck,minSupport)

        supportData.update(supX)

        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]:

            H=[frozenset([item]) for item in freqSet]

            if (i>1):

                rulesFromConseq(freqSet,H,supportData,bigRuleList,minConf)

            else:

                calConf(freqSet,H,supportData,bigRuleList,minConf)

    return bigRuleList


def calConf(freqSet,H,supportData,brl,minConf=0.7):

    prunedH=[]

    for conseq in H:

        conf=supportData[freqSet]/supportData[freqSet-conseq]

        if conf>minConf:

            print freqSet-conseq,'-->',conseq,'conf',conf

            brl.append((freqSet-conseq,conseq,conf))

            prunedH.append(conseq)

    return prunedH


def rulesFromConseq(freqSet,H,supportData,brl,minConf=0.7):

    m=len(H[0])

    if (len(freqSet)>(m+1)):

        Hmp1=aprioriGen(H,m+1)

        Hmp1=calConf(freqSet,Hmp1,supportData,brl,minConf)

        if (len(Hmp1)>1):

            rulesFromConseq(freqSet,Hmp1,supportData,brl,minConf)



5

分析结果展示:

====== RESTART: C:\Users\user\Anaconda2\Scripts\1\hapri.py =======

>>> xx=loadDataSet()

>>> L,supportData=apriori(xx,0.5)

>>> rules=generateRules(L,supportData,0.5)

frozenset([3]) --> frozenset([1]) conf 0.666666666667

frozenset([1]) --> frozenset([3]) conf 1.0

frozenset([5]) --> frozenset([2]) conf 1.0

frozenset([2]) --> frozenset([5]) conf 1.0

frozenset([3]) --> frozenset([2]) conf 0.666666666667

frozenset([2]) --> frozenset([3]) conf 0.666666666667

frozenset([5]) --> frozenset([3]) conf 0.666666666667

frozenset([3]) --> frozenset([5]) conf 0.666666666667

frozenset([5]) --> frozenset([2, 3]) conf 0.666666666667

frozenset([3]) --> frozenset([2, 5]) conf 0.666666666667

frozenset([2]) --> frozenset([3, 5]) conf 0.666666666667

6

结语:

通过调整可信度的阈值能够得到粗糙程度不一的结果,事实证明,在样本容量足够的情况下,关联分析是一种十分有效且实用的无监督学习方法。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约