首页 > 代码库 > Apriori——python3实现
Apriori——python3实现
最近看了关联算法中的Apriori没看懂,这次看了一些论文总算看懂了,不过还是没能够自己实现。在github搜到一些代码看,看的不很懂,这里先贴上(当中有自己加的注释),有时间再补充研究。
# -*- coding: utf-8 -*- """ Created on Wed Nov 30 10:05:42 2016 @author: Administrator """ from numpy import * import itertools support_dic = {} #生成原始数据,用于测试 def loadDataSet(): return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] #获取整个数据库中的一阶元素 # C1 = {1, 2, 3, 4, 5} def createC1(dataSet): C1 = set([]) for item in dataSet: C1 = C1.union(set(item)) return [frozenset([i]) for i in C1] #输入数据库(dataset) 和 由第K-1层数据融合后得到的第K层数据集(Ck), #用最小支持度(minSupport)对 Ck 过滤,得到第k层剩下的数据集合(Lk) def getLk(dataset, Ck, minSupport): global support_dic Lk = {} #计算Ck中每个元素在数据库中出现次数 for item in dataset: for Ci in Ck: if Ci.issubset(item): if not Ci in Lk: Lk[Ci] = 1 else: Lk[Ci] += 1 #用最小支持度过滤 Lk_return = [] for Li in Lk: support_Li = Lk[Li] / float(len(dataSet)) if support_Li >= minSupport: Lk_return.append(Li) support_dic[Li] = support_Li return Lk_return #将经过支持度过滤后的第K层数据集合(Lk)融合 #得到第k+1层原始数据Ck1 ‘‘‘连接步‘‘‘ def genLk1(Lk): Ck1 = [] for i in range(len(Lk) - 1): for j in range(i + 1, len(Lk)): if sorted(list(Lk[i]))[0:-1] == sorted(list(Lk[j]))[0:-1]: Ck1.append(Lk[i] | Lk[j]) return Ck1 #遍历所有二阶及以上的频繁项集合 def genItem(freqSet, support_dic): for i in range(1, len(freqSet)): for freItem in freqSet[i]: genRule(freItem) #输入一个频繁项,根据“置信度”生成规则 #采用了递归,对规则树进行剪枝 def genRule(Item, minConf=0.7): if len(Item) >= 2: for element in itertools.combinations(list(Item), 1): if support_dic[Item] / float(support_dic[Item - frozenset(element)]) >= minConf: print(str([Item - frozenset(element)]) + "----->" + str(element)) print (support_dic[Item] / float(support_dic[Item - frozenset(element)])) genRule(Item - frozenset(element)) #输出结果 if __name__ == ‘__main__‘: dataSet = loadDataSet() result_list = [] Ck = createC1(dataSet) #循环生成频繁项集合,直至产生空集 while True: Lk = getLk(dataSet, Ck, 0.5) if not Lk: break result_list.append(Lk) Ck = genLk1(Lk) if not Ck: break #输出频繁项及其“支持度” print(support_dic) #输出规则 genItem(result_list, support_dic)
输出:
Apriori——python3实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。