【Python数据挖掘课程】八.关联规则挖掘及Apriori实现购物推荐
发布时间:2021-01-08 03:19:25 所属栏目:大数据 来源:网络整理
导读:? ? ? ? 这篇文章主要介绍三个知识点,也是我《数据挖掘与分析》课程讲课的内容。 ? ? ? ?? 1.关联规则挖掘概念及实现过程; ? ? ? ? 2.Apriori算法挖掘频繁项集; ? ? ? ? 3.Python实现关联规则挖掘及置信度、支持度计算。 ? ? ? ? 前文推荐: ? ? ? ?【Pyt
四. Python实现关联规则挖掘及置信度、支持度计算? ? ? ? 由于这部分代码在Sklearn中没有相关库,自己后面会实现并替换,目前参考空木大神的博客。地址:http://www.voidcn.com/article/p-hoymzpzt-om.html # -*- coding: utf-8 -*- """ Created on Mon Nov 28 03:29:51 2016 地址:http://blog.csdn.net/u010454729/article/details/49078505 @author: 参考CSDN u010454729 """ # coding=utf-8 def loadDataSet(): return [[1,3,4],[2,5],[1,2,5]] def createC1(dataSet): #构建所有候选项集的集合 C1 = [] for transaction in dataSet: for item in transaction: if not [item] in C1: C1.append([item]) #C1添加的是列表,对于每一项进行添加,{1},{3},{4},{2},{5} C1.sort() return map(frozenset,C1) #使用frozenset,被“冰冻”的集合,为后续建立字典key-value使用。 def scanD(D,Ck,minSupport): #由候选项集生成符合最小支持度的项集L。参数分别为数据集、候选项集列表,最小支持度 ssCnt = {} for tid in D: #对于数据集里的每一条记录 for can in Ck: #每个候选项集can if can.issubset(tid): #若是候选集can是作为记录的子集,那么其值+1,对其计数 if not ssCnt.has_key(can):#ssCnt[can] = ssCnt.get(can,0)+1一句可破,没有的时候为0,加上1,有的时候用get取出,加1 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): #创建符合置信度的项集Ck,retList = [] lenLk = len(Lk) for i in range(lenLk): for j in range(i+1,lenLk): #k=3时,[:k-2]即取[0],对{0,1},{0,2},{1,2}这三个项集来说,L1=0,L2=0,将其合并得{0,1,2},当L1=0,L2=1不添加, 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] #L将包含满足最小支持度,即经过筛选的所有频繁n项集,这里添加频繁1项集 k = 2 while (len(L[k-2])>0): #k=2开始,由频繁1项集生成频繁2项集,直到下一个打的项集为空 Ck = aprioriGen(L[k-2],k) Lk,supK = scanD(D,minSupport) supportData.update(supK) #supportData为字典,存放每个项集的支持度,并以更新的方式加入新的supK L.append(Lk) k +=1 return L,supportData dataSet = loadDataSet() C1 = createC1(dataSet) print "所有候选1项集C1:n",C1 D = map(set,dataSet) print "数据集D:n",D L1,supportData0 = scanD(D,0.5) print "符合最小支持度的频繁1项集L1:n",L1 L,suppData = apriori(dataSet) print "所有符合最小支持度的项集L:n",L print "频繁2项集:n",aprioriGen(L[0],2) L,suppData = apriori(dataSet,minSupport=0.7) print "所有符合最小支持度为0.7的项集L:n",L? ? ? ? 输出结果: 所有候选1项集C1: [frozenset([1]),frozenset([2]),frozenset([3]),frozenset([4]),frozenset([5])] 数据集D: [set([1,4]),set([2,5]),set([1,5])] 符合最小支持度的频繁1项集L1: [frozenset([1]),frozenset([5])] 所有符合最小支持度的项集L: [[frozenset([1]),frozenset([5])],[frozenset([1,3]),frozenset([2,frozenset([3,5])],[frozenset([2,[]] 频繁2项集: [frozenset([1,frozenset([1,2]),5])] 所有符合最小支持度为0.7的项集L: [[frozenset([3]),[]] (编辑:通辽站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |