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 结语: |
|