代码注释:机器学习实战第11章 使用Apriori算法来发现频繁集

    xiaoxiao2021-03-25  141

    写在开头的话:在学习《机器学习实战》的过程中发现书中很多代码并没有注释,这对新入门的同学是一个挑战,特此贴出我对代码做出的注释,仅供参考,欢迎指正。

    1、发现频繁集

    #coding:gbk #作用:导入数据 #输入:无 #输出:数据集 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() #对C1中每个项构建一个不变集合,之后可以将这些集合作为字典键值使用 return map(frozenset, C1)#forzenset()是冻结的集合,是不可变的,存在哈希值 #作用:找出满足最低要求的相集 #输入:数据集,候选项集列表,感兴趣项集的最小支持度 #输出:满足最低要求的相集 def scanD(D, Ck, minSupport): ssCnt = {} #如果Ck是D的一部分,则增加字典中对应的计数值 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 #作用:创建候选项集Ck #输入:频繁项集列表Lk,项集元素个数k #输出:候选项集Ck def aprioriGen(Lk, k): retList = [] lenLk = len(Lk) for i in range(lenLk): #j从i+1开始,防止出现j小于i的情况,多建立相同候选项集 for j in range(i + 1, lenLk): #前k-2个项相同时,将两个集合合并 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

    2、挖掘关联规则

    #作用:关联规则生成主函数 #输入:频繁项集,项集的支持度值,最小可信度阈值 #输出:包含可信度的规则列表 def generateRules(L, supportData, minConf = 0.7): bigRuleList = [] for i in range(1, len(L)):#无法从单元素项集中构建关联规则,因此舍弃i=0的情况 for freqSet in L[i]: H1 = [frozenset([item]) for item in freqSet]#H1将集合freqSet化为集合的列表 if (i > 1): rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf) #只计算i = 1部分 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)

    转载请注明原文地址: https://ju.6miu.com/read-20079.html

    最新回复(0)